如何读取多维数组并将其存储在指针中

时间:2019-02-06 20:32:09

标签: c file pointers multidimensional-array

我正在尝试编写和读取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);

<path id="curveBelow" d="M 25,75 A 40 40 0 0 0 95,75" stroke="none" fill="none"></path>

<text class="badge-circle-text" x="42" y="40">
      <textPath alignment-baseline="middle" text-anchor="middle" href="#curveBelow">Text Belog</textPath>
</text>

1 个答案:

答案 0 :(得分: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);