所以我想这更像是一个风格问题。
我需要写入一个大小为3字节的动态数组元素。 (像素大小为24bpp的位图)
因此,每个元素都必须是char [3]。
如果我想避免使用struct pixel{ char R, char G, char B}
,以避免使用预处理器语句,是否可以将其写为
char* pixel[3]
并按3*sizeof(char)
?
考虑到高度和宽度,我需要一个char **像素[3],并且必须在单个char步骤中分配才能使其成为char ***像素。
所以我想我正在寻找避免使用指针指针指针的方法。 谢谢!
答案 0 :(得分:3)
您的意思是N
3个unsigned char
' s [0 ... 255]?
注意区别:
unsigned char *pixel[3]
- > char的指针数组
Vs的
unsigned char (*pixel)[3]
- >指向字符数组的指针
#include <stdio.h>
#include <stdlib.h>
#define N 4
int main(void)
{
unsigned char (*pixel)[3];
pixel = malloc(sizeof(*pixel) * N);
pixel[0][0] = 0;
pixel[0][1] = 128;
pixel[0][2] = 255;
/* ... */
pixel[3][0] = 0;
pixel[3][1] = 128;
pixel[3][2] = 255;
printf("R:%d G:%d B:%d\n", pixel[0][0], pixel[0][1], pixel[0][2]);
free(pixel);
return 0;
}
如果您在N
用malloc
替换realloc
之前不了解{{1}}
答案 1 :(得分:1)
您可以使用一维数组进行模拟。假设您要分配wxh
像素矩形。你可以写。
char *pixels = (char *) malloc(w*h*3*sizeof(char));
现在3个颜色字节在内存中显示为连续,您可以使用某种算法访问任何单元格
您可以通过定义宏来获取/设置单元格(i,j)
的颜色通道:
#define r(p, i, j) ((p)[(3*((w)*(i)+(j)))])
#define g(p, i, j) ((p)[(3*((w)*(i)+(j)) + 1)])
#define b(p, i, j) ((p)[(3*((w)*(i)+(j)) + 2)])
通话看起来像r(pixels, 0, 1)
。
答案 2 :(得分:-2)
如果你不想要结构,你就不能避免写 char***
。
但你可以使用一种类型,使其更加时尚。
因此,符合您要求的最佳解决方案似乎是:
#include <stdlib.h>
typedef char*** pixelmap_t;
int main() {
int channels = 3, width = 10, height = 10;
pixelmap_t test = malloc(width*height*channels);
int x = 1, y = 2, channel = 0;
test[x][y][channel] = 3;
free(test);
return 0;
}
看来,我完全搞砸了。我混淆了以下两件事:
声明静态3D阵列pixels[100][100][3]
时,类型为不 char***
。它是一个包含300个连续项目的一维数组。
当您声明char***
并在内存中分配300个项目时,使用pixels[x][y][z]
语法取消引用所有维度会导致取消呈现第一个维度并将内存中的值解释为指针并且取消指定此指针,而不是计算3D数组中的正确偏移量。
这意味着,我忽略了array[x][y][z]
访问器语法有两种不同的语义。第一个我会为3D数组调用array ([x][y][z])
语义,第二个我会调用((array[x])[y])[z]
的{{1}}语义(我用括号来强调)。
此代码剪切编译并运行(测试它) - 但不使用堆内存。
对于堆内存,我不知道已经发布的其他解决方案(char***
并使用malloc(width*height*channels)
访问)。
pixels[c + channels*(y + x*height)]