Realloc x86 x86_64 - PullRequest
       28

Realloc x86 x86_64

3 голосов
/ 25 ноября 2011

У меня есть функция

void *srealloc(void * ptr , int size){
    void *tmp = realloc(ptr , size);
    if(tmp == NULL){
        fprintf(stderr,"realloc of %u bytes failed", size);
        exit(1);
    }
    return tmp;
}

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

Пример того, как это вызывается:

line = "Some string";
buffer = (char**) srealloc (buffer,sizeof(buffer)*(++buffer_lines));
buffer[buffer_lines-1] = line;

Когда я отслеживаю с помощью gdb, когда srealloc вызывается на компьютере segfaulting ptr == 0x0, размер == 8

* Изменить: Segfault происходит на:

void *tmp = realloc(ptr, size);

Ответы [ 2 ]

3 голосов
/ 25 ноября 2011

Ваш звонок выглядит нормально.Сбой в malloc(), realloc(), calloc() или free() часто является признаком ошибки в другом месте вашей программы, когда вы записали за пределы выделенного блока и растоптали служебную информацию, используемуюфункции выделения памяти.

Попробуйте запустить вашу программу под инструментом вроде Valgrind или Purify.

0 голосов
/ 25 ноября 2011

Убедитесь, что код, вызывающий realloc, имеет действительный прототип для этой функции (другими словами, включает stdlib.h).

Многие проблемы при переключении с 32 на 64 бита связаны с несоответствием между целыми числами (аргументы по умолчанию, если нет прототипа) и указателями. Хотя целые числа могут оставаться на 32 битах на 64-битной платформе, указатели могут быть увеличены в размере.

Поскольку вы заявляете, что указатель равен NULL, а запрошенный размер равен 8, это, безусловно, допустимое использование функции. Реаллок нулевого указателя фактически совпадает с malloc. Вот почему я подозреваю, что проблема с прототипом.

Также убедитесь, что вы компилируете все на новом компьютере. Вы можете столкнуться с проблемами, если попытаетесь связать скомпилированный 32-битный srealloc с 64-битным скомпилированным клиентом.

...