【问题标题】: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*** .

【问题讨论】:

    标签: c arrays string pointers malloc


    【解决方案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);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-30
      • 2015-06-19
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      • 1970-01-01
      • 2020-05-06
      相关资源
      最近更新 更多