连续二维阵列指针算法的C通用函数

时间:2017-01-03 11:22:13

标签: c arrays pointers dynamic

我创建了一个函数来创建一个连续的二维数组:

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 *类型的通常指针算法一样。但是为什么第一个有效,而第二个没有?

1 个答案:

答案 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);

此处完成示例:Set pointers on Dynamic Matrix