代码将无法正确运行

标签 c

此代码旨在将图像文件中的值读取到数组中(我知道大小是 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/

相关文章:

c++ - 关于 Cygwin 的一些问题[Windows 中的 Linux](套接字、线程、其他编程和 shell 问题)

c - 在 C 中使用 sin() 的 math.h 链接器错误

c - 在函数 ‘yylex’ : 'Variable’ undeclared 中

c - MPI 和变量覆盖?

c - 无法使用 gprof 分析 libcrypto 方法

c - C语言回合制聊天程序

c - 这段C语言代码有什么问题?

c - 当我编译我的程序时,为什么它会提示 "label at end of compound statement"?

c - printf C 错误

c - 按 C 中的任意键停止控制台程序