使用malloc时串联字符串长度的差异

时间:2013-03-08 16:13:13

标签: c arrays string

为了测试一些代码,我在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数组上使用指针会改变连接字符串的大小。

3 个答案:

答案 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之前它仍然是单元化的,结果是未定义的。像你一样使用未初始化的变量会调用未定义的行为,这绝不是好事。