gpt4 book ai didi

c - 从数组中获取 C 中某些值的内存地址

转载 作者:行者123 更新时间:2023-11-30 14:59:55 25 4
gpt4 key购买 nike

我讨厌像我即将做的那样转储代码,但这确实让我感到困惑。我正在编写一个程序来读取 PPM 图像文件,这些文件具有格式、注释、宽度和高度以及最大颜色值。

然后是一系列由空格分隔的 RGB 值,我创建了一个结构体来保存三个整数来表示 RGB 颜色,以及一个结构体来保存有关 PPM 文件和像素数组的所有信息,这是一个颜色指针数组。

typedef struct colour {
int r,g,b;
} colour;

typedef struct ppm {
char * format;
int width, height, max;
colour * pixels[];
} ppm;

以及一个用于创建新颜色三元组的初始化程序:

colour * new_colour(int r, int g, int b) {
colour * c = (colour *)malloc(sizeof(colour));
c->r = r;
c->g = g;
c->b = b;
return c;
}

然后我有一个读取 PPM 文件来创建 ppm 结构的方法:

ppm * get_ppm(FILE * ppm_file){
ppm * my_ppm = malloc(sizeof(ppm));
char format[20];
char comment[100];
int n, m, max;

fgets(format, 10, ppm_file);
fgets(comment, 100, ppm_file);

char dimension_line[100];
fgets(dimension_line, 100, ppm_file);
sscanf(dimension_line,"%d %d", &n, &m);

char max_line[20];
fgets(max_line, 20, ppm_file);
sscanf(max_line, "%d", &max);

int i;
for (i = 0; i<=(m*n - 1); i++) {
my_ppm->pixels[i] = malloc(sizeof(colour));
int r, g, b;
fscanf(ppm_file,"%d %d %d ",&r,&g,&b);
my_ppm->pixels[i] = new_colour(r,g,b);
}

my_ppm->format = format;
my_ppm->width = n;
my_ppm->height = m;
my_ppm->max = max;
return my_ppm;
}

然后我有一个方法来打印我的 ppm 文件:

void show_ppm(ppm * image) {
printf("Format: %s\nW:%d H:%d\nMAX:%d\n\n", image->format,
image->width, image-> height,
image->max);
int i;
for (i = 0; i<=(image->height)*(image->width) - 1; i++) {
int r = image->pixels[i]->r;
int g = image->pixels[i]->g;
int b = image->pixels[i]->b;
printf("p[%d]: (%d,%d,%d)\n",i,r,g,b);
}
}

我使用的图像是这样的:

P3
# feep.ppma
4 4
15
0 0 0 0 0 0 0 0 0 15 0 15
0 0 0 0 15 7 0 0 0 0 0 0
0 0 0 0 0 0 0 15 7 0 0 0
15 0 15 0 0 0 0 0 0 0 0 0

它读起来完全没问题,我已经做了一些 printf 调试,它总是正确的值,即使我将值保存在结构中也很好,但是当我运行 show_ppm 时,我得到了我认为的内存地址前两个值?

p[0]: (26928080,0,26928144)
p[1]: (26928592,0,26928656)
p[2]: (0,0,0)
p[3]: (15,0,15)
p[4]: (0,0,0)
p[5]: (0,15,7)
p[6]: (0,0,0)
p[7]: (0,0,0)
p[8]: (0,0,0)
p[9]: (0,0,0)
p[10]: (0,15,7)
p[11]: (0,0,0)
p[12]: (15,0,15)
p[13]: (0,0,0)
p[14]: (0,0,0)
p[15]: (0,0,0)

但是其他一切都很好吗?我不知道我在这里做错了什么,请帮助我

如果您想查看整个文件,则为: http://pastebin.com/1FrMBYAS

提前致谢,夏兰

最佳答案

声明color * Pixels[]实际上并没有为该数组保留任何空间。当您将这样的内容放在结构体的末尾时,您需要为数组分配超出结构体本身大小的空间来保存数组的元素。例如,如果您有 100 个像素,您的分配应如下所示:

ppm *my_ppm = malloc(sizeof(ppm) + 100*sizeof(colour *));

如果您事先不知道像素数,则可以分配初始量的空间,然后在需要更多空间时realloc

关于c - 从数组中获取 C 中某些值的内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42397209/

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