gpt4 book ai didi

C 连续二维数组指针运算的泛型函数

转载 作者:行者123 更新时间:2023-11-30 19:36:12 27 4
gpt4 key购买 nike

我创建了一个函数来创建一个连续的二维数组,如下所示:

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 个字节。我改变了它,所以它会像非 void* 类型的通常指针算术一样增加 i * s 字节。但为什么第一个有效而第二个无效?

最佳答案

您的函数不会创建二维数组,内存也不是连续的。您不应该为此使用指针到指针,因为指针到指针和二维数组之间没有关系。这是一个常见的误解。

此外,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);

此处的完整示例:Set pointers on Dynamic Matrix

关于C 连续二维数组指针运算的泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41442368/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com