Исключение на malloc для структуры в C - PullRequest
1 голос
/ 26 апреля 2010

У меня есть структура, определенная так:

typedef struct {
 int n;
 int *n_p;
 void **list_pp;
 size_t rec_size;
 int n_buffs;
 size_t buff_size
} fl_hdr_type;

и в моем коде у меня есть функция для инициализации, которая имеет следующее

fl_hdr_type *fl_hdr;
fl_hdr = malloc(sizeof(fl_hdr_type) + (buff_size_n * rec_size_n));

где размер буфера передается в функцию, чтобы освободить место и для буферов.

Размер довольно мал, обычно. 100 * 50 или что-то в этом роде. В этой системе достаточно памяти для его выделения. Я не могу опубликовать трассировку стека, потому что этот код находится в другой сети, но некоторая информация извлечена из dbx в файл ядра:

buff_size_n = 32, rec_size_n = 186

и стек ... строковые числа из malloc.c

 t_splay:861
 t_delete:796
 realfree: 531
 cleanfree:945
 _malloc:230
 _malloc:186

Есть идеи, почему это не удается?

Ответы [ 4 ]

8 голосов
/ 26 апреля 2010

Попробуйте запустить вашу программу через valgrind, посмотрите, что она сообщает. Возможно, в какой-то другой части программы вы испортили свободные списки или что-то еще, что просматривает malloc.

0 голосов
/ 26 апреля 2010

Вам необходимо явно назначить n_p и list_pp для соответствующих смещений.

fl_hdr_type *fl_hdr;
fl_hdr = malloc(sizeof(fl_hdr_type) + (buff_size_n * rec_size_n));
fl_hdr->n_p = fl_hdr+sizeof(fl_hdr_type);
fl_hdr->list_pp = fl_hdr->n_p + (num_n * sizeof(int));

Если вы собираетесь это сделать, я бы порекомендовал поставить указатели в концеструктура, а не середина.Однако я с Романом и рекомендую вам использовать отдельные звонки на malloc() вместо того, чтобы захватывать все одним звонком.

0 голосов
/ 26 апреля 2010

Я превратил ваш пример в программу, и у меня нет абсолютно никаких проблем с его запуском. Если вы можете скомпилировать и запустить этот простой код (и он работает), вы повредили кучу в другом месте вашей программы. Пожалуйста, запустите его через Valgrind ( изменить как Пользователь275455 предложил, я не заметил ответ) и обновите ваш вопрос с выводом, который он дает вам.

Редактировать

Кроме того, обновите ваш вопрос, чтобы указать точно , что вы делаете с **list_pp и *n_p после распределения структуры. Если у вас нет доступа к valgrind, по крайней мере, вставьте всю трассировку, напечатанную glibc при сбое программы.

#include <stdio.h>
#include <stdlib.h>

typedef struct {
 int n;
 int *n_p;
 void **list_pp;
 size_t rec_size;
 int n_buffs;
 size_t buff_size;
} fl_hdr_type;

static size_t buff_size_n = 50;
static size_t rec_size_n = 100;


static fl_hdr_type *my_init(void)
{
        fl_hdr_type *fl_hdr = NULL;
        fl_hdr = malloc(sizeof(fl_hdr_type) + (buff_size_n * rec_size_n));

        return fl_hdr;
}

int main(void)
{
        fl_hdr_type *t = NULL;

        t = my_init();

        printf("Malloc %s\n", t == NULL ? "Failed" : "Worked");

        if (t != NULL)
           free(t);

        return 0;
}
0 голосов
/ 26 апреля 2010

Что вам нужно сделать, это просто сделать это.

fl_hdr = malloc (sizeof (fl_hdr_type)); List_pp - это динамический массив void *, и вам нужно распределить его по размеру, который вам нужен, с помощью другого malloc.

list_pp - это просто указатель на что-то еще, что выделено в куче.

Если вы хотите разместить на месте с одним malloc, вам нужно будет определить его как массив фактических типов, которые вы хотите. Компилятор должен знать типы, чтобы иметь возможность выполнять выделение.

Если вы ищете динамические массивы в C, , тогда посмотрите на это .

...