指向动态2D字符数组的三指针的内存分配

时间:2017-06-01 03:07:03

标签: c arrays string pointers malloc

对于我的C编程类,我们必须编写一个void函数,它具有file,char ***数组和int *变量作为输入。我们应该浏览文件,确定行数并将其存储在int *变量中,然后将每一行复制到char ***数组中的相应行中。

我设法从文件中获取每行的副本到char **数组,现在我需要将char ***数组指向此char **数组。不幸的是,我在这部分遇到了麻烦。

如果我尝试显示char **数组的行,一切正常。但是,如果我在将char ***数组链接到char **数组后尝试显示它的行,则会显示第一行,然后发生分段错误。

这是最后一部分的代码,其中array是char ***变量,array2是char **变量,num是int *变量,它具有文件中的行数:

array = (char***)malloc(sizeof(char**));

array = &array2;

for(i = 0; i < num; ++i) {
    printf("%s\n", *array[i]);
}

我很确定我正在处理错误的内存分配,但我可能错了。在此之前的所有代码似乎都工作得很好。

提前致谢! :)

编辑:这可能重要,也可能不重要,但在main函数中,char ***数组实际上是一个char **数组,但在使用该函数时,它输入为&amp; array,使其成为char * **。

1 个答案:

答案 0 :(得分:5)

您不想修改array,因为它指向调用函数中的变量。相反,您想要取消引用array并为其指定一个指针数组的malloc内存。

假设您在文件中有num行。首先创建一个指针数组:

*array = malloc(num * sizeof(char *));    // Don't cast the return value of malloc

然后为每一行,为该行分配空间:

for (i=0; i<num; i++) {
    char line[250];
    // read the line into "line"
    (*array)[i] = strdup(line);   // Note the parenthesis
}

如果您想使用char **array2使事情看起来更干净,您希望将其值分配给array指向的内容,而不是将array指向{{1}的地址}}:

array2