2017-02-07 4 views
1

Я пытаюсь создать динамический массив float. Пользователь должен вводить значения до тех пор, пока не будет найден отрицательный. Затем покажите массив на экране. Поскольку я не знаю размер массива, каждый раз, когда вводится действительное значение, я использую realoc() для увеличения размера массиваСоздайте и распечатайте динамический массив с плавающей точкой в ​​C

Мой код выделяет память для всех элементов, но когда я печатаю массив, я получаю ошибка сегментации. Не знаю, присвою ли значения неверным образом или не могу их прочитать.

Вот код:

#include <stdio.h> 
#include <stdlib.h> 

unsigned int createArray(float*); 
void printArray(float *, unsigned int); 

int main(){ 
    float *pArray = NULL; 
    unsigned int arrayLength = 0; 
    arrayLength = createArray(pArray); 
    printArray(pArray, arrayLength); 
    return 0; 
} 

/** 
* Ask the user to fill an array untill he types a negative value 
* 
* @param A pointer to the array we want to create 
* @return The final length of the array 
* 
*/ 
unsigned int createArray(float *pArray){ 
    float number = 1; 
    int arrayLength = 0; 

    while(number>0){ 
     printf("\nSetting number %d: ", arrayLength); 
     scanf("%f", &number); 
     arrayLength++; 
     pArray=realloc(pArray, sizeof(float)*arrayLength); 
     if(pArray==NULL){ 
      printf("\nERROR: Not enough memory"); 
      free(pArray); 
      exit(0); 
     } 
     pArray[arrayLength-1] = number; 
    } 


    return arrayLength; 
} 
/** 
* Prints an array given by the user 
* 
* @param Pointer to the array 
* @param Length of the array 
* 
*/ 
void printArray(float *pArray, unsigned int arrayLength){ 
    for(int i=0;i<arrayLength;i++){ 
     printf("\nItem[%d]: %.2f", i, *pArray+i); 
    } 
} 
+0

A d ynamic array обрабатывается не так, как статический или автоматический массив. – Olaf

+2

Что такое точка 'free (NULL)'? –

+0

Touché, Не понял об этом. –

ответ

2

Вы резервируют пространство для локальной переменной в createArray(), время жизни которых заканчивается функцией, вам необходимо передать адрес pArray:

arrayLength = createArray(&pArray); 

И затем разыменовали переданный указатель на указатель в функции:

unsigned int createArray(float **pArray) 
{ 
    ... 
    *pArray = realloc(*pArray, sizeof(float)*arrayLength); 
    if (*pArray == NULL) { 
    ... 
+0

Итак, внутри функции pArray укажет направление, в котором массив находится в памяти, * pArray указывает на память, где я хочу сохранить числа, и ** pArray указывает на один элемент?Извините меня, если это простой вопрос, но я никогда не видел указателей до того, как я их изучил сейчас. –

+0

Да, в вашем вопросе вы передаете функцию 'pArray' функции, поэтому вы резервируете место для этой (локальной) переменной, и когда вы выходите из функции, эта переменная больше не существует, в C вы« имитируете »проход по ссылке, используя адрес оператора, как в моем примере (Извините, мой плохой английский) –

+0

Все еще получил ошибку сегментации в createArray(). Не знаю, что происходит, первое присваивание идет нормально, но теперь он всегда терпит неудачу во втором. Возможно, из-за этого '** (pArray + arrayLength-1) = number;' –

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

  • Нет связанных вопросов^_^