我正在尝试编写和读取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>
答案 0 :(得分:1)
您在这里有两个不同的数据结构,每个都有不同的布局。
writed
是char
的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);