-4

これは295cからの質問の1つです

#include<stdio.h>   
#include<string.h>        
main()        
{        
    char *a="kammo DJ";         
    const char *b="roomies!!";       
    char *c;         
    a=(char *)malloc(strlen(a) + strlen(b));           
    c=(char *)malloc(strlen(a) + strlen(b));          
    c=strcat(a,b);                          
    printf("%s\n",a);               
}                          

出力は - roomies !! しかし、なぜ出力はkammo DJ + roomiesの連結でなければならないのですか!! また、c の値を教えてください。

4

3 に答える 3

3

まず、シンボルのために + + 1mallocstrlen(a)使用する必要があります。すでに宣言しているため、そのためにメモリを割り当てることはできません。for を実行すると、作成されたメモリ プールの場所が返されました。あなただけの場合:strlen(b)'\0'char * a = "kammo dj"mallocchar * amalloc

#include<stdio.h>   
#include<string.h>
#include<malloc.h>

int main()        
{        
    const char *a="kammo DJ";         
    const char *b="roomies!!";       
    char *c;
    size_t len = strlen(a) + strlen(b) + 1;
    c=(char *)malloc(len*sizeof(char));          
    strcpy(c,a);
    strcat(c,b);      
    printf("%s\n",c);
    // don't forget!
    free(c);
    return 0;

}         

出力されます'kammo DJroomies(間にスペースはありません)

于 2012-07-09T13:18:29.987 に答える
3

ここでの問題は、あなたがそうするときです

a=(char *)malloc(strlen(a) + strlen(b));    

aが を指していないことを意味し"kammo DJ"ます。代わりに、新しく割り当てられたメモリに任意のデータが含まれていることを示しています。

データの最初のバイトがaたまたま 0 を指しているように見えます。これにより、実質的aに空の文字列が作成されます。roomies!!これが、結果として得られる理由です。しかし、それはただの運です。

本当に必要なコードは次のとおりです。

#include<stdio.h>   
#include<string.h>        
main()        
{        
    const char *a="kammo DJ";         
    const char *b="roomies!!";       
    char *c;         
    c=(char *)malloc(strlen(a) + strlen(b) + 1);          
    strcpy(c,a);                          
    strcat(c,b);                          
    printf("%s\n",c);               
}
于 2012-07-09T13:24:01.013 に答える
2
a=(char *)malloc(strlen(a) + strlen(b));

終端のヌル文字のための余地が必要です。文字列のサイズは、その長さ + ヌル文字の 1 バイトです。また、文字列リテラルaを指すように宣言されました。"kammo DJ"呼び出しの後、mallocポインターが何かを指すようにします。

c=strcat(a,b);

aは文字列ではなく、 の後に不確定な値が含まれていますmalloc

于 2012-07-09T13:16:22.817 に答える