-1
我犯了一个函数来创建一个连续的二维阵列是这样的:Ç毗连二维阵列的通用功能指针运算
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;
由于指针运算法则,无效*总是会增加我* 1个字节。我改变了它,所以它会像通常的指针算术一样增加I * s字节,用于非void *类型。但为什么第一个工作,而第二个不工作?
因为'无效**'是*不*'无效*'。 '* array'具有'void *'类型(即是指针)而不是'void'。你也可能想要实现更强大的错误检查。 –
如果'pool'或'array'分配失败而另一个成功,则永远不会分配第一个内存,并最终导致内存泄漏。授予这是一个边缘案例。 –
代码中没有二维数组,也没有任何指向一个的数组!像'int **'(更糟糕的是,'void **')是一个完全不同的数据结构,不要太喜欢使用类型转换!这样的代码很难维护和理解,它也容易出现类型错误 – Olaf