几年后,我再次涉足C。我以为基于我发现的other answers,以下两个打印语句将对相同的输出求值;但是,事实并非如此。
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("%d\n", *(&arr[0][0]) + 3);
printf("%d\n", (&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。因此,这导致了不确定的行为。