通过数组语法与指针算术访问C多维数组

问题描述 投票:0回答:1

几年后,我再次涉足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]);
}

谁能解释这是怎么回事/我想念什么?

c arrays pointers malloc pointer-arithmetic
1个回答
0
投票

首先,让我解释一下您在做什么(至少对我来说是这样。

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。因此,这导致了不确定的行为。

© www.soinside.com 2019 - 2024. All rights reserved.