у меня есть функция
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 вызывается на компьютере с ошибкой сегментации ptr == 0x0, size == 8
* Редактировать: ошибка сегментации возникает:
void *tmp = realloc(ptr, size);
sizeof(buffer)
— это размер указателя на указатель на char. Чтобы быть правильным, вы должны использоватьsizeof(char *)
. Здесь это не имеет особого значения, поскольку размер указателя на один тип такой же, как и указатель на другой тип, просто хотел указать на это. - person Some programmer dude   schedule 25.11.2011char **buffer = NULL;
- person LeeG   schedule 25.11.2011realloc
.int
не является правильным типом для размеров, никогда не используйте подписанный тип для такой цели. В частности, в современных 64-битных архитектурахint
обычно составляет только 32 бита, аsize_t
— 64. Используйтеsize_t
, он предназначен для таких вещей. - person Jens Gustedt   schedule 25.11.2011