1

几年后我再次潜入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("%d\n", *(&arr[0][0]) + 3);
    printf("%d\n", (&arr[0][0])[3]);
}

谁能解释这里发生了什么/我错过了什么?

4

1 回答 1

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 个索引。所以,它会导致未定义的行为。

于 2020-06-16T10:43:08.327 回答