如何为char **及其在C中的所有char *分配内存?

时间:2016-01-30 02:41:44

标签: c pointers malloc heap

我试图像这样分配内存:

unknown_memory_2001

我认为我将{mall}用于char**

char** arr = malloc(sizeof(char**)*(SIZE));

然后我想我会循环遍历arr并将arr的每个值设置为另一个malloc来电返回的内容:

char** temp = arr;
while(temp < arr + SIZE) {
    *temp = malloc(sizeof(char*)*(SIZE));
    temp++;
}

但是我在while循环中的malloc行上进行了段错误。出了什么问题?

2 个答案:

答案 0 :(得分:1)

这里真正的问题不是错误的sizeof,而是对第一个malloc的调用失败的可能性更大。我怀疑以下变化是解决问题的真正方法。

char** arr = malloc(sizeof(char**)*(SIZE));
if (!arr) {
    // Handle the error
}
else {
    char** temp = arr;
    while(temp < arr + SIZE) {
        *temp = malloc(sizeof(char*)*(SIZE));
        temp++;
    }
}

我不相信错误的sizeof计算确实相关。考虑一下(据我所知)sizeof(char**) == sizeof(char*),所以第一个malloc实际上分配了正确的内存量(假设它实际上成功)。对malloc的内部调用本身不应该导致段错误,而应该只返回一个空指针(除非你在一些看不见的代码中把你的记忆搞得一团糟)。相反,它是可能导致段错误的间接*temp,并且只有当temp指向原始分配的末尾时才会发生这种情况,而不是(除非,第一个{{ 1}}失败)。

答案 1 :(得分:1)

@TomKarzes指出,

  

你的两个sizeof参数都是错误的。想想你实际分配的内容。第一个应该是sizeof(char *) * SIZE,第二个应该是sizeof(char) * SIZE。请记住,sizeofmalloc的参数应该总是比结果指针类型少一个间接级别。

这是对的。它对我有用。