2014-01-19 1 views
4

Оригинальный вопросПравильно ли это использование realloc?

Могу ли я использовать realloc() функцию как следующий код:

int *ptr, i, num=5; 

for (i=0; i<num; i++) 
    void *nptr = realloc (ptr, (i+1) * sizeof(int)); 
+4

No. После того, как оригинальный указатель используется в перераспределить, только возвращаемое значение (будем надеяться) использовать для следующей итерации. (и ваш исходный указатель не инициализирован, другая поездка в неопределенное поведение). Он также пропускает память, как сито. Как ни странно, инициализация 'ptr' до NULL приведет к удалению UB, но у вас все равно будет утечка. – WhozCraig

+5

'ptr' не инициализируется. – BLUEPIXY

ответ

6

нет, вы должны инициализировать ptr в начале, а затем присвоить новое значение

int *ptr = 0; 

for (unsigned i=0; i<5; i++) { 
    void *nptr = realloc (ptr, (i+1) * sizeof(int)); 
    if (nptr) ptr = nptr; 
    else abort(); 
} 

В противном случае при первом вызове вы можете передать некоторое случайное значение realloc. И память, которую вы выделили в последующих вызовах, просто будет потеряна.

-1

Нет, вы должны инициализировать указатель ptr и nptr с NULL. И объявите цикл nptr before for. ваш код должен быть как:

#include<stdio.h> 
#include<stdlib.h> 
void main() 
{ 
     int *ptr=NULL, i, num=5; 
     void *nptr=NULL; 
     for (i=0; i<num; i++) 
     { 
       nptr = realloc (ptr, (i+1) * sizeof(int)); 
       if (NULL != nptr) 
        ptr = nptr; 
     } 
} 
+0

этого недостаточно. –

+0

PLZ объяснить вниз голосом .. –

+0

@Abhiteshkhatri В цикле, каждый раз 'ptr' является' NULL'. В случае, если 'ptr' является нулевым указателем, функция ведет себя как malloc, назначая новый блок байтов размера и возвращает указатель на его начало. – BlackMamba