了解从指针到多维数组的转换/转换

时间:2014-01-19 22:54:44

标签: c multidimensional-array

我正在玩指针和数组,我想将指针转换/转换为 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

2 个答案:

答案 0 :(得分:2)

使用漂亮的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]不是多维数组,而是指针数组。每个指针指向不同的数组。值不会按顺序存储。

答案 1 :(得分:1)

您的问题是16个字节对于您的阵列是不够的。 sizeof(int)的公共值是2和4,因此您需要至少32或64个字节来表示4 int s。但无论如何都不应该将硬连线常量粘贴到代码中。使用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]);
相关问题