我很困惑为什么变量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标准禁止(例如,请参见thisthisthis的答案)。根据您所看到的行为,在我看来,编译器正在堆栈上分配一个int的空间,将arrayRack指向该空间,并将该空间打包到NumberOfArrays旁边。因此,&(arrayRack[1]) == &NumberOfArrays。无论如何,使用@dasblinkenlight建议的可变长度数组是处理这种情况的一种更干净的方法。
通常,给定int arrayRack[N];,您只能通过arrayRack[0]安全访问arrayRack[N-1]

10-08 01:18