首页 > 解决方案 > 结构中的数组分配

问题描述

我有以下代码,我需要为char data[]. 我尝试了很多东西,但它仍然不起作用。有人可以帮我吗?我知道我malloc不会为数据分配任何东西,但是如何修复它。

我想像这样分配数据:

img->data = malloc(sizeof(char)*(img->xsize * img->ysize * 3));

但是不能改变结构:

struct ppm {
    unsigned xsize;
    unsigned ysize;
    char data[]; 
};
struct ppm *img = malloc(sizeof(struct ppm));
if (!img) {
     fprintf(stderr, "Chyba alokace pameti.\n");
     exit(1);
}
if (fscanf(fp, "%x %x", &img->xsize, &img->ysize) != 2) {
     fprintf(stderr, "Spatna velikost obrazku '%s'\n", filename);
     exit(1);
}
if (fread(img->data, 3 * img->xsize, img->ysize, fp)) 
     fprintf(stderr, "Nepodarilo se nacist pixely z '%s'\n", filename);
     exit(1);
}

标签: c

解决方案


(请注意您的代码中缺少一些“{”)

struct ppm {
    unsigned xsize;
    unsigned ysize;
    char data[]; 
};

struct ppm *img = malloc(sizeof(struct ppm));

您没有空间将某些内容放入数据中,因此fread(img->data, 3 * img->xsize, img->ysize, fp)将从分配的块中写入

当你有大小时,使用realloc来增加img的大小,做

img = realloc(img, sizeof(ppm) + 3 * img->xsize * img->ysize);

if (fread(img->data, 3 * img->xsize, img->ysize, fp)) 

警告 :

  • fread就在fscanf之后,这意味着数据的开头就在第二个数字的结尾之后,例如,如果你在第二个数字之后有一个换行符,那么该换行符是fread读取的数据的一部分
  • 如果fread的结果不是 0 你认为这是一个错误,可能你想做if (fread(...) != 3 * img->xsize * img->ysize)。注意检查fread的结果不是 0 不足以确保您阅读了所有内容,因为可能是您没有阅读所有内容,即使这不是错误

推荐阅读