如果你不想要结构,你不能避免写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]
语法结果的尺寸在derefrencing第一维度和解释在存储器中作为指针的值和derefrencing该指针,而不是计算正确在3D阵列中偏移。
这意味着,我忽视了,访问器的语法有两种不同的语义。第一个我将称为3D数组的语义为array ([x][y][z])
,第二个为char***
(我使用括号强调)调用((array[x])[y])[z]
语义。
此代码剪切和工作(测试它) - 但不是使用堆内存。 对于堆内存,我不知道已经发布的那些解决方案(malloc(width*height*channels)
和访问pixels[c + channels*(y + x*height)]
)。
#include <stdlib.h>
#include <stdio.h>
int main() {
int channels = 3, width = 10, height = 10;
char test[width][height][channels];
char *ptr = (char*) test;
for (int i = 0 ; i < channels * width * height ; i++) {
ptr[i] = (char) (i % 255);
}
for (int x = 0 ; x < width ; x++) {
for (int y = 0 ; y < height ; y++) {
for (int c = 0 ; c < channels ; c++) {
int d = (int) test[x][y][c];
printf("%d %d - %d : %d\n", x, y, c, d);
}
}
}
return 0;
}
只要保留一个'char ** pixeels'并且每次你想重新分配乘以3。 – saadtaame 2015-01-21 11:12:36
“预处理器语句”的用法? – Arashium 2015-01-21 11:15:18
@saadtaame:有一个线阵列,为了说明宽度和高度,我已经有了一个指针指针,为每个像素分配3sizeof(char)都增加了必要性,这大大降低了代码的可读性和简单性。这对我的同事来说应该是容易理解的。 Arashium:将结构写入文件需要#pragma或_attribute_'s,这是gcc专用的,不会在不同的平台上编译。 – BigBadWolf 2015-01-21 11:19:42