这是我的代码:
#include <stdlib.h> //malloc
#define lineSize 16
#define columnSize 16
#define cellSize 16
int main()
{
unsigned char*** tab;
tab = malloc(sizeof(unsigned char**) * lineSize);
for(unsigned int i = 0; i < lineSize; i++)
tab[i] = malloc(sizeof(unsigned char*) * columnSize);
for(unsigned int i = 0; i < lineSize; i++)
for(unsigned int j = 0; j < columnSize; j++)
tab[i][j] = malloc(sizeof(unsigned char) * cellSize);
unsigned int line = 0;
unsigned int column = 0;
unsigned int cell = 0;
unsigned char* ptr = &tab[line][column][cell];
for(line = 0; line < lineSize; line++)
for(column = 0; column < columnSize; column++)
for(cell = 0; cell < cellSize; cell++)
*ptr = ...;
return 0;
}
此代码使用仅在执行时知道的值填充选项卡
在这种情况下没有太多问题,因为lineSize,columnSize和cellSize很小,问题是当cellSize变为100000+时,解除引用指针在时间方面变得昂贵, 这就是为什么我想用指针来避免解除引用。
问题是我不知道怎么做才能将指针更新为行,列或单元格更改。
感谢您的帮助,谢谢。
编辑:更多解释:
更大的lineSize,columnSize和cellSize,执行时间越长。这是预期的,但需要“很多时间”的是循环内部和循环内部的指针是一个解除16 * 16 * 100000次(When cellSize = 100000
)的指针。
如果我是对的,解除引用就像是:
tab[2][5][3] = tab + 2*16*100000 + 5*100000 + 3;
做数学就好16 * 16 * 100000次。
为了避免数学,我想到了一个永久指向tab[line][column][cell]
的指针,但我不知道怎么做,而不必每次cell
递增时重新计算指针。
答案 0 :(得分:3)
使用3-D数组时,除最后一个维度外,无法将指针移动到新位置。您可以沿ptr
维度移动cell
,但不能沿其他维度移动。
要做到这一点,只需添加距离:
ptr2 = ptr + dist
您在编辑中提到的计算与解除引用不同,将1-D数组解释为3-D数组时会使用它们。这将允许沿着所有维度移动。
您可以执行以下操作:
for(line = 0; line < lineSize; line++) {
unsigned char** my_line = tab[line];
for(column = 0; column < columnSize; column++)
unsigned char* my_col = my_line[column];
for(cell = 0; cell < cellSize; cell++)
unsigned char data = my_col[cell];
答案 1 :(得分:-1)
您的代码中有UB。
tab[line][column][cell];
不适用于单独的malloc-ed值。它仅适用于连续所有表元素的连续内存块。你的块可能在记忆中的任何地方。