我无法理解 first and second value of the output
,为什么它们不同?这里的第二个输出是什么意思?
守则是:
int **p = (int **)malloc(sizeof(int *) * 2);
int i, j, c = 1;
for (i = 0; i < 2; i++) {
p[i] = (int *)malloc(sizeof(int) * 2);
}
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
p[i][j] = c++;
}
}
printf("%d %d %d %d\n", (int)&p[0][0], (int)p, (int)*p, **p);
输出:34439216 34439184 34439216 1
答案 0 :(得分:1)
好的。我们先谈谈一些基本问题:
在许多系统上,int
占用的空间比void *
少。{1}}。因此,当您打印它们时,您可能会截断指针。这很容易解决,所以让我们这样做。
此外,没有必要强制转换malloc()
的值,所以让我们去除它以及稍微清理一下代码。
最后,正如克里斯所说,要使用%p
格式说明符,我们需要将int **
和int *
变量转换为void *
。
#include <stdio.h>
#include <stdlib.h>
int main() {
int **p = malloc(sizeof(int *) * 2);
int i, j, c = 1;
for (i = 0; i < 2; i++)
p[i] = malloc(sizeof(int) * 2);
for (i = 0; i < 2; i++)
for (j = 0; j < 2; j++)
p[i][j] = c++;
printf("%p %p %p %d\n", (void *) &p[0][0], (void *) p, (void *) *p, **p);
}
0x7fd193c03930 0x7fd193c03920 0x7fd193c03930 1
首先,让我们谈谈&p[0][0]
指向的地址。这是一个相当复杂的表达方式,但我们可以使用相当简单的流程来减少它,以便最终得到*p
或p[0]
。
&p[0][0] == &*(p[0] + 0) == p[0] + 0 == p[0] == *(p + 0) == *p
考虑到这一点,应该很清楚为什么&p[0][0]
(第一个参数)和*p
(第三个参数)打印相同的值。
现在,我没有看到p[0]
指向与p
相同的地址的任何充分理由。已为p
的单独调用分配了p[0]
和malloc()
的值。