【问题标题】:accessing C multidimensional array via array syntax vs pointer arithmetic通过数组语法与指针算法访问 C 多维数组
【发布时间】:2020-04-26 23:46:23
【问题描述】:

几年后我又开始涉足 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]);
}

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

【问题讨论】:

  • x[3]*(x+3) 是一样的,但是你的第一次打印是 (*x) + 3 这是不同的
  • 还有(&amp;arr[0][0])[3] 访问越界(导致未定义行为)
  • 啊,好吧,这就解释了为什么它们评估为不同的值。是的,我不确定尝试通过越界数组访问运算符访问下一个子数组是否合法,所以我想这回答了我的两个问题,谢谢。

标签: c arrays pointers malloc pointer-arithmetic


【解决方案1】:

首先,让我解释一下你在做什么(至少对我来说)。

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}

第一种情况:*(&amp;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

第二种情况:(&amp;arr[0][0])[3]

(&arr[0][0]) = Address of first element of {1, 2, 3}

但是数组的长度是 3,所以你只能访问最多 2 个的索引。 所以,它会导致未定义的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2016-01-01
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多