strcat()输出的解释

时间:2012-07-09 13:13:56

标签: c strcat

这是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);               
}                          

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

3 个答案:

答案 0 :(得分:3)

首先,由于malloc符号,您应该strlen(a) + strlen(b) + '\0' + 1。您已经声明char * a = "kammo dj",因此您无法为此分配内存。当您为malloc执行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(之间没有空格)

答案 1 :(得分: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);               
}

答案 2 :(得分:2)

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

您需要空间来终止空字符。字符串的大小是其长度+空字符的一个字节。此外,a被声明为指向"kammo DJ"字符串文字。在malloc调用之后,您将指针指向其他内容。

c=strcat(a,b);

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