2015-02-23 4 views
0

Я чтение/запись данных в пользовательский файл необработанного, где я имел обыкновение писатьMalloc терпит неудачу с Errno 12

version (int) 
data 

я реализовал более общий способ, чтобы написать свои данные и теперь ожидаемый формат

headersize (size_t) 
header (headersize) 
data 

Поэтому я вручную добавил 4 (sizeof(int)) в старый необработанный файл (с ghex), чтобы сделать его совместимым с новой реализацией.


Теперь моя программа терпит неудачу, когда malloc -ную пространство для header_p, на котором я хочу прочитать header из исходного файла.

size_t headersize; 
fread(&headersize, sizeof(size_t), 1, fd); 
printf("%p\t%d\n", header_p, (int) headersize); 
header_p = malloc(headersize); 
printf("%p\t%d\t%d\t%s\n", header_p, (int) headersize, errno,strerror(errno)); 

Возвращает

(nil) 4 
(nil) 4 12 Cannot allocate memory 

Почему бы malloc неудачу на такой операции? headersize кажется корректно записанным в необработанном файле, так как он равен 4 и errno из 12, по-видимому, указывает, что у меня недостаточно памяти, но когда я жестко код sizeof(int) при вызове malloc, сбой больше не возникает ,

size_t headersize; 
fread(&headersize, sizeof(size_t), 1, fd); 
printf("%p\t%d\n", header_p, (int) headersize); 
header_p = malloc(sizeof(int)); 
printf("%p\t%d\t%d\n", header_p, (int) headersize, errno); 

Возвращает

(nil) 4 
0x8e6e90 4 0 

Я подозреваю, что errno 12 скрывает что-то еще, но я чего не понимаю.

+0

Как определяется 'headersize' в коде? –

+1

'printf ("% s \ n ", strerror (errno));' расскажет вам больше. – mch

+0

читайте из файла: 'fread (& headersize, sizeof (size_t), 1, multifile-> fd)' – Jav

ответ

1

Eсть твоя проблема. sizeof(size_t) должен принимать размер указателя и может/не быть sizeof(int). Если вы распечатаете его с помощью (int), это выглядит хорошо, потому что оцениваются только наименее значимые 4 байта (в вашем случае). Если вы используете его для malloc(), тогда используется весь size(size_t), и это либо мусор, либо часть вашего заголовка.

Когда вы засолки номера, вы должны:

  • Беспокойство о байтов, и преобразовать его в любой маленький/большой Endian (или рычага hton* от arpa/inet.h)
  • Используйте конкретные ширины целых чисел от stdint.h , никогда не очерчивать тип без указанной ширины
2

Хорошо, вы говорите, что headersize имеет тип size_t.

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

printf("%p\t%d\n", header_p, headersize); 

Более подробную информацию here

И далее избежать undefined behaviour вы должны печатать header_p так:

printf("%p\t%zu\n", (void*)header_p, headersize); 
+2

Я включил его в (int), но так или иначе, что не отвечает на вопрос, не так ли? – Jav

+0

@Jav: В коде его не видно отбросил его на int. И если вы вызвали UB, как кажется из кода, то что-нибудь может произойти - так что да, это ответ на qustion. –

+0

Вам нужно показать больше кода, Jav – Kieveli

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