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

标签 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 个字节。我改变了它,所以它会像非 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/

相关文章:

在 C 中检查 exec 是否正在写入 stdin

c - Assembly ,没有这样的指令 popl 吗?

arrays - 我需要增加 Maximum possible array size

c++ - 如何在给定 if 条件的情况下删除整数数组中的特定元素?

php - PHP数组索引的问题

c++ - 进一步了解 i++ 和 i=i+1

c++ - 可以在地址 0 分配一个有效的指针吗?

c - 从 C 中的用户定义函数返回指针

c - 为什么我在尝试将 'char (*c)[6]' 传递给需要 'const char (*c)[6]' 的函数时收到警告?

c - libcURL 混淆后