字符串指针 内存非法-用指针对字符串排序的问题,内存访问非法(续)

问题描述

用指针对字符串排序的问题,内存访问非法(续)

还是上次类似的问题,求解答。
对字符串进行排序的问题,被指针搞糊涂了。

 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    void sort(char p[][5]);
    char ss[10][5]={"worin","trafi","panda","dalai","lama2","strin","tende","racof","lenth","recte"};
    sort(ss);
    printf("test");
}

void sort(char p[][5])
{
    int i,j,k;
    int n=10;
    char temp[20];
    for(i=0;i<n-1;i++)
    {
        k=i;
        for(j=i+1;j<n;j++)
            if(strcmp(p[k],p[j])>0)
                k=j;
        if(k!=i)
        {
            strcpy(temp,p[k]);   //本意是想复制第k个字符串,但此处将多个字符串进行复制
            strcpy(p[k],p[i]);           //程序运行到此出错,又是内存访问非法,头痛
            strcpy(p[i],temp);
        }

    }
}

解决方案

这个变量 char ss[10][5] 的定义,至少需要修改为: char ss[10][6]。就是比实现的最大字符串的长度 + 1.
否则,按字符串操作时,因为没有字符串结束符导致操作越界。

解决方案二:

确认i和k没有越界,并保证数组长度能够容纳拷贝内容

解决方案三:

 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    void sort(char p[][10]);
    char ss[10][10]={"worin","trafi","panda","dalai","lama2","strin","tende","racof","lenth","recte"};
    sort(ss);
    printf("test");
}

void sort(char p[][10])
{
    int i,j,k;
    int n=10;
    char temp[20];
    for(i=0;i<n-1;i++)
    {
        k=i;
        printf("%s n",p[i]);
        for(j=i+1;j<n;j++)
            if(strcmp(p[k],p[j])>0)
                k=j;
        if(k!=i)
        {
            strcpy(temp,p[k]);   //本意是想复制第k个字符串,但此处将多个字符串进行复制
            strcpy(p[k],p[i]);           //程序运行到此出错,又是内存访问非法,头痛
            strcpy(p[i],temp);
        }

    }
}

时间: 2024-08-01 22:32:21

字符串指针 内存非法-用指针对字符串排序的问题,内存访问非法(续)的相关文章

c++-C++ 字符串指针输出的为什么是完整字符串,而不是地址

问题描述 C++ 字符串指针输出的为什么是完整字符串,而不是地址 char str[3] = {'a','b',''}; cout<<str<<endl; //1 char *pChar = str; cout<<pChar<<endl; //2 int in[3] = {1,2,3}; cout<<in<<endl; //3 以上代码,1和2处的str.pChar不是指针么?为什么输出的是"ab",而不是一个地址

C++ 用指向指针的指针的方法对5个字符串排序并输出时遇到的问题

问题描述 C++ 用指向指针的指针的方法对5个字符串排序并输出时遇到的问题 //用指向指针的指针的方法对5个字符串排序并输出 void sort(char **p) { char* temp=new char;//为什么没有长度呢?这么可以没有长度呢?? for(int j=0;j<5;j++) { for(int k=j;k<5;k++) { if(strcmp(p[j],p[k])>0) { temp=p[j]; p[j]=p[k]; p[k]=temp; } } } } int m

Linux编程C++内存管理的指针传递详解

指针参数是如何传递内存的? 如果函数的参数是一个指针,不要指望用该指针去申请动态内存.示例7-4-1中,Test函数的语句GetMemory(str, 200)并没有使str获得期望的内存,str依旧是NULL,为什么? 1 2 3 4 5 6 7 8 9 10 void GetMemory(char *p, int num) { p = (char *)malloc(sizeof(char) * num); } void Test(void) { char *str = NULL; GetMe

动态内存和智能指针

由编译器自动分配的内存都有着严格的生存期.全局对象在程序启动时分配,在程序结束时销毁.对于局部自动对象,当我们进入其定义所在的程序块时被创建,在离开块时销毁.局部static对象在第一次使用前分配,在程序结束时销毁. 除了自动和static对象外,C++还支持动态分配对象.动态分配的对象的生存期与它们在哪里创建是无关的,只有当显式地被释放时,这些对象才会销毁.   静态内存用来保存局部static对象,类static数据成员以及定义在任何函数之外的变量.栈内存用来保存定义在函数内的非static

Linux下C++内存管理的指针传递详解

指针参数是如何传递内存的? 如果函数的参数是一个指针,不要指望用该指针去申请动态内存.示例7-4-1中,Test函数的语句 GetMemory(str, 200)并没有使str获得期望的内存,str依旧是NULL,为什么? void GetMemory(char *p, int num) { p = (char *)malloc(sizeof(char) * num); } void Test(void) { char *str = NULL; GetMemory(str, 100); // s

jna-JNA 读取内存中的指针地址比实际的长

问题描述 JNA 读取内存中的指针地址比实际的长 通过接口得到了一个内存的指针,通过这个指针得到了在读取另一个指针的时候,其地址后面比正确地址多了一段.

通过内存分析工具来证明字符串驻留机制

在这之前我写过一些文章来介绍关于字符串内存分配和驻留的文章,涉及到的观点主要有:字符串的驻留机制避免了对具有相同字符序列的字符串对象的重复创建:被驻留的字符串是不受GC管辖的,即被驻留的字符串对象不能被GC回收:被驻留的字符串是被同一进程中所有应用程序域共享的.至于具体的原因,相信在<关于CLR内存管理一些深层次的讨论>中,你可以找到答案.由于这些天来在做一些关于内存泄露审查的工作,所以想通过具体的Memory Profiling工具来为你证实上面的结论.我采用的Memory Profilin

类中的内存分配和指针类型强制转换问题

问题描述 类中的内存分配和指针类型强制转换问题 问题描述: template //element type class list { private: EleT data;//数据本身,即是需要的信息 list* prio;//the pointer of prior element list* next;//the pointer of next element list* last;//the last pointer of list int len;//the length of list

用MFC的对话框载入摄像头并处理,运行接近10分钟后提示内存出错,指针都释放掉了。这是什么原因呀?

问题描述 用MFC的对话框载入摄像头并处理,运行接近10分钟后提示内存出错,指针都释放掉了.这是什么原因呀? 相关的代码: void CMFC_VedioDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 if(!pCapture) { pCapture = cvCaptureFromCAM(0); pFrame = cvQueryFrame(pCapture); drawToDC(pFrame, IDC_Open); } SetTimer(I