c - 指向连续二维数组的指针

标签 c pointers multidimensional-array

我使用的是带有标志 -Wall -std=gnu99 的 gcc 版本 4.8.0。

我需要在C中使用malloc为连续的二维数组动态分配内存;这个事实是不容谈判的。但是,为了便于使用,我仍然希望能够使用方便的 x[r][c] 表示法来访问数组。这是我创建指向连续二维数组的指针并通过执行 *array[r][c] 索引该数组的勇敢尝试:

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    size_t rows = 3, cols = 5;

    printf("sizeof(int) = %li\n\n", sizeof(int));

    int (*array)[rows][cols] = malloc(sizeof(int) * rows * cols);
    printf("array starts at %p\n", array);
    printf("sizeof(array) = %li\n", sizeof(array));
    printf("sizeof(array[0][0]) = 0x%lx\n", sizeof(array[0][0]));
    puts("");

    unsigned short r, c;

    for (r = 0; r <= rows - 1; r++) {
        for (c = 0; c <= cols - 1; c++) {
            printf("array[%i][%i] is at %p\n", r, c, &(*array[r][c]));
        };
        puts("");
    };
}

虽然它编译时没有警告,但它有一些意外的输出:

sizeof(int) = 4

array starts at 0x16cc010
sizeof(array) = 8
sizeof(array[0][0]) = 0x14

array[0][0] is at 0x16cc010
array[0][1] is at 0x16cc024
array[0][2] is at 0x16cc038
array[0][3] is at 0x16cc04c
array[0][4] is at 0x16cc060

array[1][0] is at 0x16cc04c
array[1][1] is at 0x16cc060
array[1][2] is at 0x16cc074
array[1][3] is at 0x16cc088
array[1][4] is at 0x16cc09c

array[2][0] is at 0x16cc088
array[2][1] is at 0x16cc09c
array[2][2] is at 0x16cc0b0
array[2][3] is at 0x16cc0c4
array[2][4] is at 0x16cc0d8

我不太明白这里发生了什么。这些元素是连续的,但对于整数来说它们太大了,而数组又太小而无法容纳所有元素。

我的数组声明是我最不确定的部分 - 我正在阅读 int (*array)[rows][cols] 因为“array is a指向整数数组(带有 stride cols)的指针”,但显然这是不正确的。

我到底做错了什么?

最佳答案

int (*array)[cols] = malloc( sizeof *array * rows );

for (r = 0; r <= rows - 1; r++) {
    for (c = 0; c <= cols - 1; c++) {
        printf("array[%i][%i] is at %p\n", r, c, &array[r][c]);

这允许您将array索引为array[i][j],因为array[i]隐式取消引用指针。

要解除分配,您只需调用

free( array );

关于c - 指向连续二维数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16613046/

相关文章:

python - 将一个数组的每一行与numpy中另一个数组的每个元素相乘

c - 在什么情况下 lua_close 会引发 Segmentation Fault 错误?

c - 了解内存分配

cs50 pset3,频率功能不起作用

c - C 中指针的二分查找

javascript - 如何将多维 JSON 对象转换为 javascript 数组

c - 为什么在为矩阵分配内存时会出现段错误?

pointers - 可以将结构指针方法中的指针重新分配给另一个实例吗?

c++ - 如何从另一个类中的私有(private)指针指向的类中获取私有(private)信息?

ruby - 在多维嵌套数组上调用递归函数的问题