我创建了一个函数来创建一个连续的二维数组:
void** create2DArray(int row, int col, size_t s) {
void *pool = malloc(s * row * col);
void **array = malloc(s * row);
if(pool==NULL || array==NULL) return NULL;
for(int i=0;i<row;i++) {
array[i] = pool + i * col * s;
}
return array;
}
上面的函数使用如下:
int **edge_matrix = create2DArray(num_vertices, num_vertices, sizeof(int));
它没有问题。但是有一天,我认为我犯了一个错误,我改变了一行代码:
array[i * s] = pool + i * col * s;
由于指针算术规则,void *将始终增加i * 1字节。我改变它所以它将增加i * s字节,就像非void *类型的通常指针算法一样。但是为什么第一个有效,而第二个没有?
答案 0 :(得分:0)
您的函数不会创建2D数组,也不会创建连续的内存。你不应该使用指针到指针,因为指针指针和2D数组之间没有关系。这是一种常见的误解。
此外,C语言不允许对void指针进行指针运算。有些编译器支持将其作为非标准扩展,相当于字符类型的指针算法。
无论如何,你甚至不需要指针运算。只需:
void* create2DArray (size_t row, size_t col, size_t item_size)
{
return malloc (item_size * row * col);
}
或者,更有意义:
void create2DArray (size_t row, size_t col, (type** arr_ptr)[row][col])
{
*arr_ptr = malloc ( sizeof type[row][col] );
}
// caller:
type (*array)[row][col];
create2DArray(row, col, &array);