在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/C/ 一個(gè)程序,總是段錯(cuò)誤,希望能幫我看下哪里有問(wèn)題?

一個(gè)程序,總是段錯(cuò)誤,希望能幫我看下哪里有問(wèn)題?

#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","錯(cuò)誤");
        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);

}

回答
編輯回答
冷溫柔

如果只想編譯通過(guò)的話(huà)可以做如下修改:

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


修改成

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

其次memcpy在拷貝時(shí)不應(yīng)該兩次都用max,應(yīng)該一次la 一次用lb,你仔細(xì)琢磨是不是這個(gè)道理.memcpy前是不是要檢查各自大小,比如char str1[3]="12" str2[4]="123",這樣交換就存在問(wèn)題吧?
以上回答知識(shí)拋磚引玉,肯定還有很多沒(méi)考慮到的地方。

2018年3月29日 08:05
編輯回答
墨小羽

這是我修改后的程序,暫時(shí)運(yùn)行正常。

#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","內(nèi)存分配錯(cuò)誤");
        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);

}
2018年3月2日 17:58
編輯回答
苦妄
char * str="123";
char * str2="456";

這樣申請(qǐng)的 2 個(gè)字符串,實(shí)際上是 2 個(gè) 指針 str 和 str2 分別指向了 2 個(gè)字符串常量。

所以當(dāng)你執(zhí)行這段代碼的時(shí)候:

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

均會(huì)報(bào)錯(cuò),因?yàn)槟阍噲D去修改字符串常量。


另外如果你給出的 2 個(gè)字符串長(zhǎng)度不一樣,你的程序一樣會(huì)出錯(cuò),這個(gè)留給你自己思考解決吧

2018年6月29日 12:24