关于C中的二维数组--> array[1][0] 和 array[0][1] 相同吗?

发布于 2024-11-05 13:35:48 字数 166 浏览 0 评论 0原文

int main ()
{
    int arr[10][1];
    arr[1][0]=44;
    arr[0][1]=55;
    printf("%i",arr[1][0]);
    return 0;
}

这应该打印出“55”还是“44”???

int main ()
{
    int arr[10][1];
    arr[1][0]=44;
    arr[0][1]=55;
    printf("%i",arr[1][0]);
    return 0;
}

Should this print out "55" or "44"???

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

木緿 2024-11-12 13:35:48

不存在 arr[0][1] 这样的元素 - 就像不存在元素 arr[10][0] 一样 - 数组索引是从零开始的。

如果您声明:

int arr[10][2];

您的代码将按您的预期工作。

通过声明

int arr[10][1];

,当您访问 arr[0][1] 时,您将访问超出第一个数组“行”末尾的内容。 C 中的内存访问不会被检查,因此您的访问会为存储在 arr[1][0] 中的元素添加别名。

如果交换两个赋值语句的顺序,您会看到显示的值取决于这两个赋值的顺序。后面的赋值会覆盖前面赋值的值。即:

int main ()
{
    int arr[10][1];
    arr[0][1]=55;
    arr[1][0]=44;
    printf("%i",arr[1][0]);
    return 0;
}

...将打印 44,只是因为这将是写入内存中 int 大小的位置的最终值。

编辑:因为我们有很多人在这里发表评论,声称将糟糕的 C99 标准解释为将您调用的行为声明为“未定义行为”...考虑到以下代码执行与上面相同的操作,由于第 6.5 节。 2.1:

int main(int argc, char *argv[])
{
    int arr[10][1];

    arr[1][0] = 44;
    arr[0][1] = 55;

    printf("Value is: %d\n", 0[arr][1]);

    return 0;
}

在一个链接的问题中,有人声称,由于对齐问题,C 编译器可能会选择填充数组“行”之间的空间。那是虚假信息;没有 C 标准表明这是可能的。

There is no such element as arr[0][1] -- just as there is no element arr[10][0] -- array indices are zero based.

If you declare:

int arr[10][2];

Your code will work as you intended.

With the declaration

int arr[10][1];

when you access arr[0][1] you are accessing beyond the end of the first array "row." Memory access in C is not checked, so your access aliases the element stored at arr[1][0].

If you swapped the order of the two assignment statements, you would see that the value displayed depends on the order of those two assignments. The later assignment writes over the value from the earlier assignment. I.e.:

int main ()
{
    int arr[10][1];
    arr[0][1]=55;
    arr[1][0]=44;
    printf("%i",arr[1][0]);
    return 0;
}

...would print 44, simply because that would be the final value written to that int-sized spot in memory.

EDIT: Because we have so many people commenting here, claiming to interpret the lousy C99 standard as declaring the behavior you have invoked as "undefined behavior"... Consider that the following code does the same thing as above, due to section 6.5.2.1:

int main(int argc, char *argv[])
{
    int arr[10][1];

    arr[1][0] = 44;
    arr[0][1] = 55;

    printf("Value is: %d\n", 0[arr][1]);

    return 0;
}

In a linked question, the claim has been made that the C compiler may choose to pad the space between array "rows" due to alignment concerns. That is disinformation; no C standard says that is possible.

裸钻 2024-11-12 13:35:48

不,他们不一样。您声明了一个由十个数组组成的数组,每个数组都有一个整数元素。 arr[0][1] 大于您的数组索引,因此应该是一个错误。结果应该是 44。

No they are not the same. You declared an array of ten arrays each with a single integer element. arr[0][1] is greater than your array index so should be an error. The result should be 44.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文