c - 关于C中的二维数组--> array[1][0]和array[0][1]是一样的吗?

标签 c arrays

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

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

最佳答案

没有 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 标准说这是可能的。

关于c - 关于C中的二维数组--> array[1][0]和array[0][1]是一样的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5917253/

相关文章:

c - GLSL:用旋转 vector 旋转?

CSV 到 C 中的数组

php - 如何在php中将mysql数据库中的数据存储为关联数组

arrays - 带有 SimpleXMLElement 和键数组的 Twig "in"运算符

ios - 如何在 Swift 4 中用 ascii 空格填充文本框输入提醒字节?

c - 如何在不使用时间函数、静态变量或全局变量的情况下编写随机生成器函数?

c - Malloc 段错误

c - gSoap - 服务调用返回 SOAP_OK,但返回未初始化的结构

c - 如何正确地将 C 结构写入磁盘上的文件,以便可以在其上使用 mmap?

Javascript 数组遍历覆盖键值