此代码旨在将图像文件中的值读取到数组中(我知道大小是 16*8)。
当我动态创建 img 数组以便我可以拥有任何大小的图像时,它在运行时崩溃,当我手动将其设置为正确的大小时(char img[16][8];
)它可以工作.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
FILE *fin;
fin= fopen ("test.pgm","rb");
if (fin == NULL)
{
printf ("ERROR");
fclose(fin);
}
int i=0,j=0,u=16,v=8,d;
char test[20];
char k;
char c[10];
while((k=fgetc(fin))!='\n')
{
test[j]=k;
j=j+1;
}
char **img = (char**) calloc(u,sizeof(char*));
for ( i = 0; i < u; i++ )
{
img[i] = (char*) calloc(v,sizeof(char));
}
fread(img,1,(u*v),fin);
for (i=0; i<u; i++)
{
for (j=0; j<v; j++)
{
printf("%d ",img[i][j]);
}
printf("\n");
}
fclose(fin);
}
最佳答案
由于您动态分配 16 个独立的 8 字节数组,因此您需要计算对每个数组的 16 次单独读取。 (我已经删除了不必要的、可能容易出错的 calloc()
转换)。
char **img = calloc(u,sizeof(char*));
for ( i = 0; i < u; i++ )
{
img[i] = calloc(v,sizeof(char));
fread(img[i],1,v,fin);
}
/*fread(img,1,(u*v),fin);*/
您的单个 fread()
调用适用于 char img[16][8]
,因为在这种情况下,img
包含大小为 16 * 8 字节的连续内存。但是,该调用不适用于您创建动态分配数组的方式,因为 img
现在是一个指针数组,因此您有 fread()
调用将用文件中的数据覆盖这些指针值。
如果您想对 fread()
进行一次调用,那么您可以更改动态分配(并与 VLA 结合)
char (*img)[v];
img = malloc(u * sizeof(*img));
fread(img,1,(u*v),fin);
这将 img
声明为指向 char
数组 v
的指针(v
已初始化为 8 )。然后,它在 img
的连续分配中分配 u
(即 16)许多 char
的数组 v
。现在,img
可用于单个 fread()
调用,就像您对 char img[16][8]
所做的那样,并且还保留img
的“2D”寻址也相同。
关于代码将无法正确运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18691779/