Ошибка сегментации - C с использованием malloc - PullRequest
0 голосов
/ 23 августа 2011

Я пытаюсь выделить память для массива указателей на объект. ObjectP - указатель на структуру с именем Object. перед этой функцией я объявляю массив как: ObjectP * array. Таким образом, массив является указателем на массив указателей на объект. Затем я посылаю & массив, поэтому у меня будет указатель на это. Скажем, мой table_size равен 2. Я получаю ошибку сегментации при попытке ввести * array [1] = NULL В чем проблема?

Это мой код:

    void allocateArrayMemory(ObjectP** array,size_t table_size)
    {
    *array=(ObjectP*)malloc(table_size*sizeof(ObjectP));
    int i=0;
    for (i = 0; i < (int)table_size; ++i)
    {
        *array[i]=NULL;
        printf("%d\n",i);
    }
    printf("finished allocating\n");
    if(*array==NULL)
    {
        printf("null\n");
    }

    }

1 Ответ

1 голос
/ 23 августа 2011

Код *array[i]=NULL; действует как *(array[i])=NULL;, а вы хотите (*array)[i]=NULL;.

Когда i = 1, *(array[i]) разыменовывает struct Object ***, который следует за struct Object ***, который вы передали в allocateArrayMemory, в то время как (*array)[i] разыменовывает вторую struct Object ** в области свежеиспользуемой памяти.1011 *

Некоторые примечания:

  1. Исправлено написание слова «Сегментация» в заголовке.

  2. Проверьте результат malloc перед использованием.В вашем коде у вас есть тест после использования * array;переместите его вверх.

  3. Я предлагаю использовать memset(*array, 0, table_size*sizeof(ObjectP)); вместо цикла для инициализации * массива.

  4. Это плохая форма в C для приведениярезультат malloc.Вместо этого просто скажите *array = malloc(table_size*sizeof(ObjectP));.

  5. По стилю, я бы использовал allocateArrayMemory как функцию, которая возвращает адрес выделенной памяти, а не через параметр.Например:

    ObjectP* allocateArrayMemory(size_t table_size) {

    ObjectP *array = malloc(table_size*sizeof(ObjectP));

    ...

    if(array==NULL) { printf ...; return NULL; }

    ...

    for (i=0; i < table_size; ++i)

    {
    

    array[i] = NULL;

    ...

    }
    

    ...

    return array;

и в вызывающей стороне ObjectP *a; ... a = allocateArrayMemory(6);.

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