一个程序,总是段错误,希望能帮我看下哪里有问题?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int getmax(int a, int b)
{
    if(a>b)
    {
        return a;
    }else
    {
        return b;
    }
}

void  swap(void * a, void * b)
{
    void * tmp;
    int la=sizeof(a);
    int lb=sizeof(b);
    int max=getmax(la,lb);    
    void * t=(void *)malloc(max);
    if(t ==NULL)
    {
        printf("%s\n","错误");
        exit(0);
    }
    memcpy(t,a,max);
    memcpy(a,b,max);
    memcpy(b,t,max);
    printf("%d\n",sizeof(a));
    printf("%d\n",sizeof(b));
    printf("%d\n",max);
    free(t);

}

int main()
{
    char * str="123";
    char * str2="456";
    swap((void *)str,(void *)str2);
    printf("%s\n",str);
    printf("%s\n",str2);

}

阅读 2.6k
3 个回答
char * str="123";
char * str2="456";

这样申请的 2 个字符串,实际上是 2 个 指针 str 和 str2 分别指向了 2 个字符串常量。

所以当你执行这段代码的时候:

memcpy(a,b,max);
memcpy(b,t,max);

均会报错,因为你试图去修改字符串常量。


另外如果你给出的 2 个字符串长度不一样,你的程序一样会出错,这个留给你自己思考解决吧

如果只想编译通过的话可以做如下修改:

  char * str="123";
  char * str2="456";


修改成

char str1[]="123";
char str2[]="456";
        
    

其次memcpy在拷贝时不应该两次都用max,应该一次la 一次用lb,你仔细琢磨是不是这个道理.memcpy前是不是要检查各自大小,比如char str1[3]="12" str2[4]="123",这样交换就存在问题吧?
以上回答知识抛砖引玉,肯定还有很多没考虑到的地方。

这是我修改后的程序,暂时运行正常。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
int getmax(int a, int b)
{
    if(a>b)
    {
        return a;
    }else
    {
        return b;
    }
}

void  swap(void * a, void * b,int la, int lb)
{
    void * tmp;
    int max=getmax(la,lb);    
    void * t=(void *)malloc(max);
    if(t == NULL)
    {
        printf("%s\n","内存分配错误");
        exit(0);
    }
    memcpy(t,a,max);
    memcpy(a,b,max);
    memcpy(b,t,max);
    
    free(t);

}

int main()
{
    char str[]="123456789";
    char str2[]="abcd";
    printf("%s\n",(char *)str);
    printf("%s\n",(char *)str2);

    swap((void *)str,(void *)str2, sizeof(str), sizeof(str2));
    printf("%s\n",(char *)str);
    printf("%s\n",(char *)str2);

}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进