2013-11-18 4 views
1

Я делаю назначение для класса, и я думал, что я ошибка, вы все с вопросом:инициализация массива с помощью функции в C

Поэтому цель программы для пользователя, чтобы ввести размер самого массив, а затем инициализировать его некоторыми данными. Максимальный размер - 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; 
} 
+0

Где инициализируется initCounter? – Raxvan

+0

Если это код C, почему вы также пометили его '[C++]'? – NPE

+3

Вы можете также остановиться сразу после второй строки в 'main()'. Буквально * ничего хорошего может следовать за этим. – WhozCraig

ответ

1

Вы должны прочитать sizeOfArray, прежде чем выделить MyArray динамически, как это:

поплавок * туАггау = таНос (sizeOfArray * SizeOf (поплавок));

Это распределение sizeof (float) * sizeOfArray байтов памяти в куче и назначение адреса выделенной памяти myArray.

Это, возможно, трудно понять о массивах в C, они на самом деле просто указатели на память - в вашей программе массив myArray распределяется статически на стеке и имеет размер 0. Вы не можете добавить к нему какие-либо элементы или назначить любой индекс, он не будет расти, его плавучий элемент 0 с плавающей точкой. Самое лучшее, что может случиться с вашей программой в этом случае, - это сбой. В худшем случае, это не сбой, и странные вещи произойдут;

Вы действительно должны прочитать что-то о распределении памяти/управлении в C.

+0

Благодарим за помощь и помощь! Отлично! –

+2

Вы не нуждаетесь в динамическом распределении памяти здесь, C имеет VLA целую вечность. Даже если вы идете по пути 'malloc', это плохая форма для возврата возвращаемого значения. И ** массивы не являются указателями. ** Они часто _decay_ в указатель на первый элемент, но есть очень четкие различия. – paxdiablo

+1

Спасибо @paxdiablo, вы правы в актерском составе. Я забыл о VLA, делал больше C++ последние 20 лет :) Я стою исправлено. Вы правы в массивах, а не в указателях, но поверьте мне, я понимаю разницу, но, в конце концов, например, передавая ее как аргумент функции, это просто указатель. – petrku

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]; 
+0

это незаконно в C. Извините :) – egur

+0

@egur; Это законно в C (C99 допускает это) :) – haccks

+0

Его не совсем легально, но gcc «понимает» такие вещи и отлично справляется с ними. – Mansueli

1

У вас есть (variable-length) array от нулевого размера. Вам нужно сначала задать размер, а затем выделить массив. В противном случае любые попытки присвоения элементам массива приведут к undefined behaviour.

1

Эти две линии

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

Создать пустой массив. Итак, что бы вы ни пытались сохранить в этом массиве позже, это доступ за пределами и вызывает неопределенное поведение. Тот факт, что ваша программа вылетает на 14-й вызов, - просто удача. Возможно, он тоже разбился по первому.

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

Ваш массив создан здесь с нулевым размером. Он не волшебным образом расширяется, когда вы позже увеличиваете sizeOfArray. Вам нужно сначала установить переменную размера (из вашего ввода пользователем «строка или два кода») , затем создать массив на основе этого.

Вы также можете ввести некоторый разумный верхний предел размера вашего массива, так что вы не взорвать ваш стек при попытке, например, создать массив один миллиард въездной :-)

0

динамический массивы не поддерживаются на C или C++. Изменить массив:

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

Динамические массивы поддерживаются C99. – haccks

+0

Большое спасибо !!! Это работало как шарм! –

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();

EDIT Обратите внимание, что, так как вы уже знаете размер макс вы могли бы избежать этого динамического распределения перечисленных выше:

#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; 
} 

Вероятно, это последний вариант, что ваш учитель на самом деле ищет.

+0

Благодарим за помощь и помощь! РАБОТАЛ!! Очень ценю это! –

+0

Добро пожаловать! – Mansueli

Смежные вопросы