【问题标题】:Understanding casting/conversion from pointer to multidimensional array了解从指针到多维数组的转换/转换
【发布时间】:2014-02-09 00:26:09
【问题描述】:

我在玩指针和数组,我想将一个指向 int 数组的指针(使用 malloc 分配)转换/转换为一个多维数组int.

我不知道为什么下面的 C 程序不会两次打印相同的数字。

...
str->val = malloc(16);
int (*m)[4][4] = str->val;
printf("The number is %d, yes the number is %d", str->val[4+1], (*m)[1][1]);
...

现在,第一个打印的数字是正确的,但第二个不是。我在 SO 上发现了与我类似的其他问题,但我无法解决我的问题。对于可能的重复,我深表歉意。

我还有一个问题:以下声明有什么区别?

int m[10];
int (*m)[10];

编辑:

我的问题是由我的 struct 的字段 val 的错误声明引起的:我将其声明为 char

【问题讨论】:

标签: c multidimensional-array


【解决方案1】:

使用漂亮的cdecl.org 工具,int (*m)[4][4] 被转换为declare m as pointer to array 4 of array 4 of int,这是一个多维数组。如果您分配更多内存,它应该可以工作。

int m[10]; 是在内存中堆叠为一行的 10 个整数的数组。 int (*m)[10]; 是一个指向包含 10 个值的数组的指针。

int m[4][5] 是多维数组,但它们几乎就像int m[20]。它们在内存中堆叠为一行。索引m[2][0] 被简单地转换为m[5*2 + 0]

int *m[5] 不是多维数组,它是指针数组。每个指针指向不同的数组。值不按顺序存储。

【讨论】:

    【解决方案2】:

    您的问题是 16 个字节对于您的数组来说是不够的。 sizeof(int) 的常用值是 2 和 4,因此您至少需要 32 或 64 个字节来表示 4 个ints。但是无论如何,您都不应该将硬连线常量粘贴到您的代码中。使用sizeof 运算符,它会起作用:

    int (*arr)[4][4] = malloc(sizeof(*arr));
    int *ptr = &(*arr)[0][0];
    
    // fill it with something, then:
    
    printf("%d = %d\n", (*arr)[1][1], ptr[1 * 4 + 1]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多