gpt4 book ai didi

c - 结构体中的数组分配

转载 作者:行者123 更新时间:2023-11-30 20:18:05 26 4
gpt4 key购买 nike

我有以下代码,我需要为 char data[] 分配内存。

但是无法更改结构:

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

有人可以帮我吗?

我希望像这样分配数据:

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

您没有空间在 data 中放置某些内容,因此 fread(img->data, 3 * img->xsize, img->ysize, fp) 将写出分配的 block

当你有尺寸时,使用realloc增加img的尺寸

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

之前

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

警告:

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

关于c - 结构体中的数组分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55089328/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com