我很困惑为什么变量NumberOfArrays
第二次通过代码中的for
循环改变。有人能帮我吗?
#include <stdio.h>
#include <cs50.h>
int main(int argc, string argv[])
{
//variable declarations
int NumberOfArrays = 0;
int arrayRack[0];
//Get number of arrays
printf("Key in the number of arrays you'd like to have\n");
NumberOfArrays = GetInt();
//Get number for each element in arrayRack[]
for(int i = 0; i < NumberOfArrays; i++)
{
printf("give me an int for the %i th array\n", i + 1);
arrayRack[i] = GetInt();
// *** on the second pass, my "NumberOfArrays" gets adjusted to my GetInt number here. Why?
}
//print out numbers stored in respective arrays
for(int j = 0; j < NumberOfArrays; j++)
{
printf("{%i}<-- number in %ith array\n", arrayRack[j], j + 1);
}
return 0;
}
最佳答案
因为您将arrayRack
声明为空数组([0]
)。尝试int arrayRack[100];
或其他数字,并在使用前确保NumberOfArrays
小于该数字。
解释:(编辑注意,这可能因编译器而异)您的变量很可能存储在附近的内存地址堆栈中。所以arrayRack
指向记忆中接近NumberOfArrays
的地方。C通常不会检查数组的末尾是否已经用完,因此在这种情况下访问arrayRack[1]
不会导致编译器错误但是,arrayRack[1]
不是数组的一部分,因此访问它实际上会访问其他内容-在这种情况下,NumberOfArrays
。
编辑gcc允许长度为0的数组,但不为每个this分配空间。但是,长度-0数组被C标准禁止(例如,请参见this、this和this的答案)。根据您所看到的行为,在我看来,编译器正在堆栈上分配一个int
的空间,将arrayRack
指向该空间,并将该空间打包到NumberOfArrays
旁边。因此,&(arrayRack[1]) == &NumberOfArrays
。无论如何,使用@dasblinkenlight建议的可变长度数组是处理这种情况的一种更干净的方法。
通常,给定int arrayRack[N];
,您只能通过arrayRack[0]
安全访问arrayRack[N-1]
。