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

时间:2016-10-04 18:01:36

标签: 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;

}

2 个答案:

答案 0 :(得分:4)

因为您将Public Sub saveAttachtoDisk(itm As Outlook.MailItem) Dim objAtt As Outlook.Attachment Dim saveFolder As String saveFolder = "C:\Temp\" For Each objAtt In itm.Attachments objAtt.SaveAsFile saveFolder & "\" & objAtt.DisplayName Set objAtt = Nothing Next End Sub 声明为空数组(arrayRack)。请尝试[0]或其他一些号码,并确保int arrayRack[100];小于该号码,然后再使用它。

说明:(编辑请注意,这可能因编译器而异)您的变量很可能存储在附近内存地址的堆栈中。所以NumberOfArrays指向内存中接近arrayRack的位置。 C通常不会检查您是否在数组末尾运行,因此在这种情况下访问NumberOfArrays不会导致编译器错误。但是,arrayRack[1]不属于您的数组,因此访问它实际上会访问其他内容 - 在这种情况下,arrayRack[1]

编辑 gcc允许length-0数组,但不会为this分配空间。但是,C标准禁止使用长度为0的数组(例如,请参阅thisthis的答案和this)。鉴于您所看到的行为,我认为编译器在堆栈上分配了一个NumberOfArrays的空间,将int指向该空间,并将该空间打包在{ {1}}。结果,arrayRack。无论如何,使用@dasblinkenlight建议的可变长度数组是一种更清晰的方法来处理这种情况。

一般情况下,只有NumberOfArrays,您才能安全地通过&(arrayRack[1]) == &NumberOfArrays访问int arrayRack[N];

答案 1 :(得分:3)

你太早宣布了这个数组。在GetInt()调用之后将声明移动到,如下所示:

printf("Key in the number of arrays you'd like to have\n");
int NumberOfArrays = GetInt();
int arrayRack[NumberOfArrays];

注意: NumberOfArrays不是变量的理想名称,因为它表示数组元素的数量,而不是数组的数量;你的代码只有一个数组。