更改数组元素的代码会更改不同的变量
Code to change an array element changes a different variable
我很困惑为什么我的变量 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. However, length-0 arrays are prohibited by the C standard (e.g., see this, the answers to this, and this) 为它们分配 space。鉴于您所看到的行为,在我看来编译器正在堆栈上分配一个 int
的 space,将 arrayRack
指向那个 space,并将 space 打包到 NumberOfArrays
旁边。结果,&(arrayRack[1]) == &NumberOfArrays
。无论如何,按照@dasblinkenlight 的建议使用可变长度数组是处理这种情况的一种更简洁的方法。
一般来说,给定 int arrayRack[N];
,您只能通过 arrayRack[N-1]
.
安全访问 arrayRack[0]
您过早声明数组。将声明移动到 GetInt()
的调用之后,如下所示:
printf("Key in the number of arrays you'd like to have\n");
int NumberOfArrays = GetInt();
int arrayRack[NumberOfArrays];
注意: NumberOfArrays
不是变量的理想名称,因为它表示数组元素的个数,而不是数组的个数;你的代码只有一个数组。
我很困惑为什么我的变量 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. However, length-0 arrays are prohibited by the C standard (e.g., see this, the answers to this, and this) 为它们分配 space。鉴于您所看到的行为,在我看来编译器正在堆栈上分配一个 int
的 space,将 arrayRack
指向那个 space,并将 space 打包到 NumberOfArrays
旁边。结果,&(arrayRack[1]) == &NumberOfArrays
。无论如何,按照@dasblinkenlight 的建议使用可变长度数组是处理这种情况的一种更简洁的方法。
一般来说,给定 int arrayRack[N];
,您只能通过 arrayRack[N-1]
.
arrayRack[0]
您过早声明数组。将声明移动到 GetInt()
的调用之后,如下所示:
printf("Key in the number of arrays you'd like to have\n");
int NumberOfArrays = GetInt();
int arrayRack[NumberOfArrays];
注意: NumberOfArrays
不是变量的理想名称,因为它表示数组元素的个数,而不是数组的个数;你的代码只有一个数组。