Cygwin malloc переопределяет другую память в куче - PullRequest
0 голосов
/ 05 октября 2011

У меня странная ошибка при попытке распределить память. У меня есть указатель на структуру, которая является "malloced", и я хочу другую структуру. Поэтому я снова вызываю malloc, и указатель, который возвращает malloc, указывает на пустое пространство - пока все в порядке. Затем я запоминаю выделенную область, и она переопределяет другую переменную, которая все еще используется. Первая структура в памяти находится в 0x1643c98, а заданный указатель на вторую - 0x1643bf8, но я хочу malloc 200 байт. Код:

data_t *data = get_head_data(); 
int length = data->head.length;
data_t *new_data = malloc(length); 
memset(new_data, 0x00, length); // this line override the perivously malloced data 
//some other operation

Я использую Window XP (32 бит) и Cygwin, с GCC 3.4.4. Процессор Intel Core 2 Duo. Любая идея, что не так или в чем должна быть проблема? Заранее спасибо.

РЕДАКТИРОВАТЬ: Извините, я был совершенно неверный трек. Есть функция с ошибкой, которая называется неожиданным. Когда я позже вызываю malloc, предыдущий адрес остается в памяти, и я думаю, что он действителен, но он был свободен () - ред. Спасибо всем за советы!

Ответы [ 2 ]

1 голос
/ 05 октября 2011

data_t *new_data = malloc(length);

Если sizeof(data_t) не равно 1, эта строка может быть ошибкой. Вы выделяете length байт. Если вам нужен массив length data_t, то вам нужно выделить sizeof(data_t)*length байт.

Лучшим решением было бы использовать calloc, как предполагает @littleadv. Эта функция принимает отдельные аргументы для number_of_items и sizeof_item, поэтому сложнее ошибиться.

1 голос
/ 05 октября 2011

Если вам нужно установить вновь выделенную память на 0 - используйте calloc.Вы, вероятно, путаете указатели, размеры и переменные - проверьте ваш код еще раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...