【问题标题】:How to read a multidimensional array and store it in a pointer如何读取多维数组并将其存储在指针中
【发布时间】:2019-06-30 21:45:38
【问题描述】:

我正在尝试写入和读取char 三维数组,或者换句话说,字符串数组的数组。

我已经尝试在数组的每个部分分配内存,但总是失败并出现以下错误:Segment fault (core dumped)

/**
 * Create array to write
 */
char writed[2][2][512] = {{"Hello", "World"}, {"Bye", "World"}};
/**
 * Allocate memory
 */
char *** readed = (char ***)malloc(sizeof(char **) *2 * 2 * 512);
for (int z = 0; z < 2; z++) {
    readed[z] = (char **)malloc(sizeof(char **) * 2 * 512 );
    for (int y = 0; y < 2; y++) {
        readed[z][y] = (char *)malloc(sizeof(char) * 512); 
    }
}    
/**
 * Write array
 */
FILE *writeFile = fopen("strings", "wb");
fwrite(writed, 2 * 2 * 512, 2 * 512, writeFile);
fclose(writeFile);
/**
 * Read array
 */
FILE *readFile = fopen("strings", "rb");
fread(readed, 2 * 2 * 512, 2 * 512, readFile);
fclose(readFile);

【问题讨论】:

  • 你不需要分配那么多内存。您只需要乘以第一个数字。这并不能解决问题,但你应该改变它。
  • 请发minimal reproducible example,以便我们重现问题,然后帮助您调试
  • 已经解决了。谢谢

标签: c file pointers multidimensional-array


【解决方案1】:

这里有两种不同的数据结构,每种都有不同的布局。

writedchar 的3 维数组,表示数组的所有内存都是连续的。相比之下,readed 是一个指向char ** 数组的指针,每个数组都指向一个char *, 数组,每个数组都指向一个char 数组,并且这些都不需要是连续的。

要拥有类似的数据结构,您需要将 readed 声明为指向 2D 数组的指针,并为 3D 数组分配足够的空间:

char (*readed)[2][512] = malloc(2 * sizeof(char[2][512]));

另外,don't cast the return value of malloc

您的写作/阅读方式也超出了您的需要:

fwrite(writed, 2 * 2 * 512, 2 * 512, writeFile);
...
fread(readed, 2 * 2 * 512, 2 * 512, readFile);

这表示您正在读取/写入2 * 512 元素,每个元素的大小为2 * 2 * 512。您只读取/写入该大小的 1 个成员:

fwrite(writed, 2 * 2 * 512, 1, writeFile);
...
fread(readed, 2 * 2 * 512, 1, readFile);

【讨论】:

  • 我试图声明readed,正如你提到的,没有为数组的每个位置分配内存,但现在编译器失败并出现错误free(): invalid pointer. Abort (core dumped)
  • @DanielAlessandroAguilar 你应该只freemalloc,特别是free(readed)
  • 我没有调用free函数,我只是更改了指针声明并删除了在每个位置分配内存的for
  • @DanielAlessandroAguilar 查看我的编辑。您正在写入/读取太多字节。
  • 谢谢,您的编辑解决了我的问题,我认为fread / fwrite 的第三个参数是数组中每个元素的字节大小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 1970-01-01
相关资源
最近更新 更多