更改数组元素的代码会更改不同的变量

标签 c arrays for-loop cs50

我很困惑为什么我的变量 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 为它们分配空间.但是,C 标准禁止使用长度为 0 的数组(例如,参见 thisthisthis 的答案)。鉴于您所看到的行为,在我看来编译器正在堆栈上分配一个 int 的空间,将 arrayRack 指向该空间,然后打包NumberOfArrays 旁边的那个空间。结果,&(arrayRack[1]) == &NumberOfArrays。无论如何,按照@dasblinkenlight 的建议使用可变长度数组是处理这种情况的一种更简洁的方法。

一般来说,给定int arrayRack[N];,你只能通过arrayRack[N-1]安全地访问arrayRack[0] >.

关于更改数组元素的代码会更改不同的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39858906/

相关文章:

VBA 用户表单作为输入框

c - OpenCV:从 harpia 导出源代码后: "too few arguments to function ‘cvHaarDetectObjects’“

c++ - 为什么 printf 函数族关心语言环境?

arrays - Swift:按函数值对对象排序

arrays - 如何选择数组的每个值

javascript - jQuery:循环迭代编号类?

java - 为什么可以在循环中创建具有相同变量名的线程对象?

c - 初始化一个多维数组,然后在C中打印内容

c - 使用 POSIX 线程进行大量日志记录的理想方法?

sql - 存储和比较独特的组合