C语言如何将存储RGB图像的一维结构体数组当作二维数组访问
实现方法
完全可以实现,不需要修改内存分配的总大小,只需要调整pixels的指针类型即可,适配不同C标准的两种写法如下:
写法1:C99及以上标准(支持动态宽高)
如果你的编译环境支持C99及更高标准的可变长度数组,可直接用动态宽高定义:
struct pix { unsigned char red; unsigned char green; unsigned char blue; // 原示例代码此处缺少分号,需补充才能正常编译 }; const int width = 800; const int height = 600; // 声明pixels为「指向长度为width的struct pix数组」的指针 struct pix (*pixels)[width] = malloc(height * sizeof(*pixels));
此时你就可以直接合法执行pixels[0][0].red=255这类操作,第一个下标对应图像的行(Y轴,取值范围0599),第二个下标对应图像的列(X轴,取值范围0799),和常规图像的坐标逻辑完全匹配。
写法2:兼容C89等老标准(固定宽高)
如果需要兼容不支持可变长度数组的老版本C标准,可以把宽度定义为常量写死:
#define IMG_WIDTH 800 #define IMG_HEIGHT 600 struct pix { unsigned char red; unsigned char green; unsigned char blue; }; struct pix (*pixels)[IMG_WIDTH] = malloc(IMG_HEIGHT * sizeof(*pixels));
使用方式和写法1完全一致。
注意事项
- 该方法没有额外内存开销,malloc分配的总空间和你原本的一维数组分配逻辑完全相同
- 内存释放逻辑不需要调整,直接调用
free(pixels)即可 - 注意控制下标范围,行下标不能超过
height-1,列下标不能超过width-1,否则会触发未定义行为
内容的提问来源于stack exchange,提问作者2lean4
相关产品推荐
相关产品推荐

