0

Achar**总是让我感到困惑。以下代码生成分段错误。请解释...

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
    char** nameList;
    nameList = malloc(4*sizeof(char*));
    nameList[0] = malloc(12); //not sure if needed but doesn't work either
    nameList[0] = "Hello "; 
    printf("%s  ",nameList[0]);// even this statement isn't executed
    strcat(nameList[0], "World");
    printf("%s ",nameList[0]);
    return 0;
}
4

3 回答 3

3

之后nameList = malloc(4*sizeof(char*));:nameList[0] = 垃圾 nameList[1] = 垃圾 nameList[2] = 垃圾 nameList[3] = 垃圾

nameList[0] = "Hello ";你有 nameList[0] = "Hello" nameList[1] =垃圾桶 nameList[2] =垃圾桶 nameList[3] =垃圾桶

因此,当您这样做时strcat(nameList[1], "World");,很可能会出现段错误,因为 nameList[1] 可以指向内存中的任何位置。

于 2013-08-24T01:10:49.377 回答
1

您的代码通过写入只读存储并尝试写到它的末尾来表现出未定义的行为。

你的malloc想法是朝着正确方向迈出的一步。但是,您应该使用strcpy复制"Hello"到新分配的内存中。此外,在计算动态分配的大小时,您需要考虑计划附加的字符串的大小以及空终止符。

显然,您还需要在程序结束时释放所有分配的内存:

char** nameList;
nameList = malloc(4*sizeof(char*));
nameList[0] = malloc(12);
strcpy(nameList[0], "Hello ");
printf("%s  ",nameList[0]);
strcat(nameList[0], "World"); // You were strcat-ing into a wrong element
printf("%s ",nameList[0]);
free(nameList[0]);
free(nameList);

ideone 上的演示

于 2013-08-24T01:10:33.473 回答
0

在使用双ptr 之前,获取使用单ptr 工作的代码。此外,您不想“过度编程”简单的代码。但是,如果您想对双指针的使用进行编程,请从该代码开始并修改为使用双指针。

int main()
{
        char *nameList;

        nameList = malloc(12);   // point nameList to 12 bytes of storage

        strncpy(nameList, "Hello \0", 7);
        printf("%s\n",nameList);   // notice no space, its already after hello

        strncat(nameList, "World", 5);
        printf("%s\n",nameList);

        free(nameList);

        return 0;
}
于 2013-08-24T04:16:42.620 回答