-4

这是295c的问题之一

#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);               
}                          

输出是 - 室友!但是为什么输出应该是kammo DJ + roomies的串联!!还告诉c的值是多少?

4

3 回答 3

3

首先,你应该mallocstrlen(a)++ strlen(b)1 因为这个'\0'符号。你已经声明char * a = "kammo dj"了,所以你不能为此分配内存。当您执行mallocfor时,它返回创建char * a的内存池的位置。malloc如果你这样做:

#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));

您需要为终止空字符留出空间。字符串的大小是它的长度+空字符的一个字节。也a被声明为指向"kammo DJ"字符串文字。通话后,malloc您使指针指向其他内容。

c=strcat(a,b);

a不是一个字符串,并且在 . 之后包含一个不确定的值malloc

于 2012-07-09T13:16:22.817 回答