这是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的价值是什么?
答案 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
之后包含不确定的值。