为了测试一些代码,我在C中编写了以下程序:
int main(int argc, char *argv[])
{
char *a = "hello ";
char *b = "there";
char *c = malloc(100);
strcat(c, a);
strcat(c, b);
printf("length of a is %d\n", strlen(a));
printf("length of concatenated string is %d\n", strlen(c));
return 0;
}
这个输出是:
length of a is 6
length of concatenated string is 11
现在我没有做malloc,而是执行了以下操作(其余代码是相同的):
char c[100];
输出更改为:
length of a is 6
length of concatenated string is 12
我不明白为什么在char数组上使用指针会改变连接字符串的大小。
答案 0 :(得分:3)
由于在调用c
后没有将任何内容放入malloc
,因此调用strcat
会导致未定义的行为,因为分配的内存块可能根本不包含空终止符。在这种情况下,strcat
最终会在搜索终结符时访问分配块之外的内存。
这应该使呼叫保持一致:
char *c = malloc(100);
*c = '\0';
答案 1 :(得分:3)
两个示例中的行为都是未定义的。 strcat在源字符串中的终止nul之后附加数据。 c
未初始化,因此未定义在哪里(以及是否)它将有一个nul终止符。
如果您更改为使用strcpy
后跟strcat
strcpy(c, a);
strcat(c, b);
答案 2 :(得分:1)
使用calloc将c的元素初始化为0.否则在第一次调用strcat之前它仍然是单元化的,结果是未定义的。像你一样使用未初始化的变量会调用未定义的行为,这绝不是好事。