Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于C中的二维数组-->;数组[1][0]和数组[0][1]是否相同?_C_Arrays - Fatal编程技术网

关于C中的二维数组-->;数组[1][0]和数组[0][1]是否相同?

关于C中的二维数组-->;数组[1][0]和数组[0][1]是否相同?,c,arrays,C,Arrays,这应该打印“55”还是“44”?不,它们不一样。您声明了一个由十个数组组成的数组,每个数组都有一个整数元素arr[0][1]大于数组索引,因此应为错误。结果应该是44。不,它们不一样。您声明了一个由十个数组组成的数组,每个数组都有一个整数元素arr[0][1]大于数组索引,因此应为错误。结果应该是44。没有像arr[0][1]这样的元素——就像没有元素arr[10][0]一样——数组索引是零基的 如果您声明: int main () { int arr[10][1]; arr[1

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

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

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

没有像
arr[0][1]
这样的元素——就像没有元素
arr[10][0]
一样——数组索引是零基的

如果您声明:

int main ()
{
    int arr[10][1];
    arr[1][0]=44;
    arr[0][1]=55;
    printf("%i",arr[1][0]);
    return 0;
}
您的代码将按预期工作

随着宣言

int arr[10][2];
当您访问
arr[0][1]
时,您的访问超出了第一个数组“行”的末尾。C中的内存访问未被选中,因此您的访问会将存储在
arr[1][0]
中的元素别名

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

int arr[10][1];
…将打印44,因为这将是写入内存中整数大小点的最终值

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

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

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

没有像
arr[0][1]
这样的元素——正如没有元素
arr[10][0]
一样——数组索引是零基的

如果您声明:

int main ()
{
    int arr[10][1];
    arr[1][0]=44;
    arr[0][1]=55;
    printf("%i",arr[1][0]);
    return 0;
}
您的代码将按预期工作

随着宣言

int arr[10][2];
当您访问
arr[0][1]
时,您的访问超出了第一个数组“行”的末尾。C中的内存访问未被选中,因此您的访问会将存储在
arr[1][0]
中的元素别名

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

int arr[10][1];
…将打印44,因为这将是写入内存中整数大小点的最终值

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

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

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

但结果是55。为什么会这样?@Anc-因为
arr[0][1]
是非法的。您已将数组声明为
intarr[10][1]
,这意味着它有10列和1行。然后,
arr[0][1]
尝试访问第一列的第二行,该行不存在,因此它会做一些疯狂的事情。@Chris——这并不违法。这不是OP所期望的。@Chris Lutz:undefined意味着undefined;编译器不需要拒绝代码或在二进制文件中发出错误信号。任何结果都是可能的,就标准而言,同样正确。@Chris,@John——告诉我任何C标准在哪里表明这种行为是未定义的。事实上,ISO 9899:TC2第6.5.2.1节定义了其行为方式。我知道,任何超出为阵列定义的存储的访问都肯定会调用未定义的行为。但我相信你所说的关于数组索引、指针访问等的内容是不正确的。所讨论的访问是在定义的空间内,只是以一种奇怪的方式访问。然而结果是55。为什么会这样?@Anc-因为
arr[0][1]
是非法的。您已将数组声明为
intarr[10][1]
,这意味着它有10列和1行。然后,
arr[0][1]
尝试访问第一列的第二行,该行不存在,因此它会做一些疯狂的事情。@Chris——这并不违法。这不是OP所期望的。@Chris Lutz:undefined意味着undefined;编译器不需要拒绝代码或在二进制文件中发出错误信号。任何结果都是可能的,就标准而言,同样正确。@Chris,@John——告诉我任何C标准在哪里表明这种行为是未定义的。事实上,ISO 9899:TC2第6.5.2.1节定义了其行为方式。我知道,任何超出为阵列定义的存储的访问都肯定会调用未定义的行为。但我相信你所说的关于数组索引、指针访问等的内容是不正确的。正在讨论的访问在定义的空间内,只是以一种奇怪的方式访问。这应该会引起鼻恶魔。这不是一个家庭作业,斯特罗姆先生。。我以为我知道C数组,但那个简单的代码输出了一个我没想到的结果(在这种情况下是55)。所以我在寻找一个解释。。FTWIf如果你知道C阵列,你希望55存储在哪里?这会引起鼻恶魔。这不是一个家庭作业,斯特罗姆先生。。我以为我知道C数组,但那个简单的代码输出了一个我没想到的结果(在这种情况下是55)。所以我在寻找一个解释。。FTWIf如果您知道C阵列,您希望55存储在哪里?非常感谢您指出显而易见的问题。我知道,如果我将其声明为[10][2],将不会有任何问题。但是为什么程序将55分配给arr[1][0]我无法理解…好的。经过一点思考,我可以