指向动态二维字符数组的三重指针的内存分配

Posted

技术标签:

【中文标题】指向动态二维字符数组的三重指针的内存分配【英文标题】:Memory Allocation for a Triple Pointer that Points to a Dynamic 2D Char Array 【发布时间】:2017-11-02 00:43:12 【问题描述】:

对于我的 C 编程课程,我们必须编写一个具有文件、char*** 数组和 int* 变量作为输入的 void 函数。我们应该遍历文件,确定行数并将其存储在 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]);

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

提前致谢! :)

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

【问题讨论】:

【参考方案1】:

您不想修改array,因为它指向调用函数中的一个变量。相反,您想取消引用 array 并将它分配给一个指针数组的 malloc'ed 内存。

假设文件中有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 指向array2 的地址:

char **array2 = malloc(num * sizeof(char *));
*array = array2;
...
for (i=0; i<num; i++) 
    char line[250];
    // read the line into "line"
    array2[i] = strdup(line);

【讨论】:

以上是关于指向动态二维字符数组的三重指针的内存分配的主要内容,如果未能解决你的问题,请参考以下文章

C语言动态分配二维字符串数组

C 语言二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 | 每个 一级指针 指向不同大小内存 | 精准分配每个 一级指针 指向的内存大小 )

指向 C++ 中动态分配的二维数组中的一行的指针

指针数组的动态内存分配

如何使用 C++ 中的指针动态分配和解除分配二维数组?

如何在c中为指向char的指针数组分配内存