На RHEL6 я столкнулся со странной проблемой с realloc(). В какой-то момент программы realloc() возвращает NULL (у старого указателя есть адрес и много доступной памяти). Выделяется 200 элементов структуры (структура ниже). По какой-то причине, когда я вместо этого делаю realloc(), это работает, но тогда мне приходится присваивать старый указатель новому. Ниже приведена упрощенная версия моего кода.
Возможно, это проблема настройки сервера, а не программирования. Каково ваше мнение?
Спасибо.
//hearder file
typedef struct { /* Variable Node Detail Record */
long next;
long mask;
char *value;
// more stuff...
} NODETEST;
extern NODETEST *oldNodes;
extern NODETEST *newNodes;
//program
#define MAXSIZE 200
// do some stuff with oldNodes....
int alloc_nodes (void)
{
// Allocate or grow the table
oldNodes = (NODETEST *) malloc(MAXSIZE * sizeof(NODETEST));
if( oldNodes == NULL ) {
//handle exception...
exit(1);
}
//oldNodes = (NODETEST *) realloc(oldNodes,MAXSIZE * sizeof(NODETEST)); // *** FAILS
newNodes = (NODETEST *) realloc(oldNodes,MAXSIZE * sizeof(NODETEST)); // *** WORKS
if( newNodes == NULL ){
printf("errno=%d\n", errno );
}else{
oldNodes = newNodes; }
}
perror
при сбоеrealloc
илиmalloc
(илиcalloc
). - person Basile Starynkevitch   schedule 06.10.2014perror
и покажите нам, что он возвращает - person Farouq Jouti   schedule 06.10.2014free
на старом указателе? - person Marian   schedule 06.10.2014realloc()
, а неmalloc()
. Я так понимаю это ошибка? Было бы неплохо скопировать/вставить код, с которым вы действительно видите проблему. - person Michael Burr   schedule 06.10.2014valgrind
; может быть больше, чем вы думаете. - person Jonathan Leffler   schedule 06.10.2014malloc
. Скорее всего, ошибка в отсутствующем коде. - person Mark Lakata   schedule 06.10.2014realloc
закомментирована или нет, то ваша последняя строкаif
будет читать неинициализированныйnewNodes
. - person Mark Lakata   schedule 06.10.2014realloc
либо РАБОТАЕТ, либо НЕ РАБОТАЕТ, в зависимости от того, в какую переменную вы сохраняете результат? Это очень нереально. Я не верю, что код, который вы разместили выше, точно описывает ситуацию, с которой вы имеете дело. - person AnT   schedule 06.10.2014