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