使用C中的函数初始化数组

时间:2013-11-18 20:43:54

标签: c arrays function function-pointers

我正在为课堂做作业,我想我会问你所有问题:

因此,程序的目的是让用户输入数组的大小,然后用一些数据初始化它。最大大小为20.我的问题是,当设置大小超过14并尝试初始化时,阵列崩溃。因此,例如,如果它将大小设置为20,则接受它,但是当我尝试初始化它时,它会崩溃。我不知道我在做什么。非常感谢您的帮助。

非常感谢,

ESSI

int main ()
{

     int sizeOfArray = 0; //size Of Array
     float myArray[sizeOfArray];

     //I have a piece a line or two of code that asks the user for the size of the    
       array

     printf("Let's Initialize an array of size %d!!\n", sizeOfArray);
     do
     {
           printf("Enter array element %d : ", initCounter+1);
           myArray[initCounter] = userInitArray();
           initCounter++;
      }while (initCounter < sizeOfArray);
}

float userInitArray()
{
      float num;
      scanf("%f", &num);
      return num;
}

7 个答案:

答案 0 :(得分:2)

这两行

 int sizeOfArray = 0; //size Of Array
 float myArray[sizeOfArray];

创建一个空数组。因此,无论您稍后尝试存储在此数组中的是访问界限并调用未定义的行为。你的程序在第14次调用时崩溃的事实就是运气。它也可能在第一个上崩溃。

答案 1 :(得分:2)

int sizeOfArray = 0; //size Of Array
float myArray[sizeOfArray];

您的阵列是 here ,大小为零。当您稍后增加sizeOfArray时,它不会神奇地扩展。您需要首先设置大小变量(从您的'或两行代码'用户输入)然后基于此创建数组。

您可能还想对数组大小施加一些合理的上限,这样在尝试时不会炸掉堆栈,例如,创建一个十亿条目的数组: - )

答案 2 :(得分:1)

您的(variable-length) array大小为零。您需要首先询问大小,然后分配数组。否则,任何分配给数组元素的尝试都会产生undefined behaviour

答案 3 :(得分:1)

你可以这样做:

int sizeOfArray; //size Of Array
printf("tell me the size of the array");
scanf("%d",&sizeOfArray);
float myArray[sizeOfArray]; // not a good practice 

正确的做法是:

int sizeOfArray; //size Of Array
float *myArray;
printf("tell me the size of the array");
scanf("%d",&sizeOfArray);
myArray=malloc(sizeof(float)*sizeOfArray); 

然后您可以将指针用作公共数组。 并像这样调用:myArray [3] = doSomething();

编辑请注意,由于您已经知道最大尺寸,因此可以避免执行上面列出的动态分配:

#Define MAXSIZE 20
int main ()
{

     int sizeOfArray; //size Of Array
     float myArray[MAXSIZE];

     printf("tell me the size of the array\n");
     scanf("%d",&sizeOfArray);

     printf("\nLet's Initialize an array of size %d!!\n", sizeOfArray);
     do
     {
           printf("Enter the element at myArray[%d] : ", initCounter+1);
           myArray[initCounter] = userInitArray();
           initCounter++;
      }while (initCounter < sizeOfArray);
}

float userInitArray()
{
      float num;
      scanf("%f", &num);
      return num;
}

可能最后一个选项是老师实际要找的东西。

答案 4 :(得分:1)

在动态分配myArray之前,您需要读取sizeOfArray,如下所示:

float * myArray = malloc(sizeOfArray * sizeof(float));

这是在堆上分配sizeof(float)* sizeOfArray字节的内存,并为myArray分配已分配内存的地址。

这可能很难理解C中的数组,它们实际上只是指向内存的指针 - 在你的程序中,数组myArray在堆栈上静态分配,大小为0.你不能添加任何元素或分配给任何元素索引,它不会增长,它的forewer 0浮动元素很长。在这种情况下,您的程序可能发生的最好的事情是它会崩溃。最糟糕的情况是,它不会崩溃,会发生奇怪的事情;

你真的应该在C中阅读有关内存分配/管理的内容。

答案 5 :(得分:0)

我认为您忘记在程序开头添加函数原型(main之前) 而且

 int sizeOfArray = 0; //size Of Array
 float myArray[sizeOfArray];   

错了。
当您使用可变长度数组(在C99中有效)时,您可以将其作为

 int sizeOfArray; //size Of Array
 printf("Let's Initialize an array of size %d!!\n", sizeOfArray);
 float myArray[sizeOfArray];

答案 6 :(得分:0)

C或C ++不支持动态数组。 将您的数组更改为:

float* myAraray;
//later when you have the size , allocate it:
myArray = (float*)malloc(arrSize * sizeof(float));