第一种情况:
第二种情况:
几年后,我将再次进入C。我原以为,根据我找到的其他答案,以下两份打印报表会得到相同的结果;然而,情况似乎并非如此。
int main()
{
int** arr = malloc(
3 * sizeof(int*)
);
for(int y = 0; y < 3; y++) {
int* subarr = malloc(
3 * sizeof(int)
);
for(int x = 0; x < 3; x++) {
subarr[x] = y * 3 + x + 1;
}
arr[y] = subarr;
}
printf("%dn", *(&arr[0][0]) + 3);
printf("%dn", (&arr[0][0])[3]);
}
有人能解释一下这里发生了什么/我遗漏了什么吗?
首先,让我解释一下你在做什么(至少对我来说(。
arr[0] = A pointer to array {1, 2, 3}
arr[1] = A pointer to array {4, 5, 6}
arr[2] = A pointer to array {7, 8, 9}
第一种情况:*(&arr[0][0]) + 3
&arr[0][0] = Address of first element of {1, 2, 3}
*(&arr[0][0]) = 1 // Dereferencing the address
因此,它打印1 + 3 = 4
第二种情况:(&arr[0][0])[3]
(&arr[0][0]) = Address of first element of {1, 2, 3}
但是数组的长度是3,所以您最多只能访问2个索引。因此,它导致了不明确的行为。