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);
}
解决方案
(请注意您的代码中缺少一些“{”)
在
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 不足以确保您阅读了所有内容,因为可能是您没有阅读所有内容,即使这不是错误
推荐阅读
- javascript - 如何为谷歌的地理定位 API 获取 wifiAccessPoints 或 Cell Tower 对象?
- javascript - 单元测试 Angular 服务
- django - Kubernetes 中的 Django、nginx 和 gunicorn
- php - 使用 Eclipse PDT 进行远程调试
- ios - 第一次反应原生iOS无法打开相机/画廊
- applescript - Applescript - Idein
- javascript - 了解 Eloquent JS 第 3 版中的一个示例
- c# - 将字体字形限制为字体具有的字形
- java - 用中线交换二维矩阵对角线
- c - 在 free(x) 中将 null 值设置为 x(在语言实现中)