结构中的数组分配

时间:2019-03-10 15:36:03

标签: c

我有以下代码,我需要为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);
}

1 个答案:

答案 0 :(得分:1)

(请注意,您的代码中缺少一些'{')

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)) 

警告:

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