0

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

4

3 回答 3

3

两个示例中的行为都是未定义的。 strcat在源字符串中的终止 nul 之后附加数据。 c未初始化,因此未定义在何处(以及是否)它将具有 nul 终止符。

如果您更改为使用strcpy后跟,您将获得一致的结果strcat

strcpy(c, a); 
strcat(c, b);
于 2013-03-08T16:15:41.020 回答
3

c由于您在调用后没有放入任何内容malloc,因此调用strcat会导致未定义的行为,因为分配的内存块可能根本不包含空终止符。在这种情况下,strcat最终将在搜索终止符期间访问分配块之外的内存。

这应该使调用一致:

char *c = malloc(100);
*c = '\0';
于 2013-03-08T16:15:09.270 回答
1

使用 calloc 将 c 的元素初始化为 0。否则它在第一次调用 strcat 之前保持未初始化,结果未定义。像您这样使用未初始化的变量会调用未定义的行为,这永远不会好。

于 2013-03-08T16:16:05.043 回答