Динамическое выделение массива структур - PullRequest
6 голосов
/ 23 октября 2011

Я находил полезные ответы на вопросы других людей здесь, на stackoverflow, но я впервые задаю свой вопрос.

У меня есть функция C, которая динамически должна выделять место длямассив структур, а затем заполнить элементы структуры каждого элемента массива значениями, извлеченными из файла.Назначение членов отлично работает на первом проходе цикла, но я получаю ошибку сегментации на втором проходе.

Я написал эту быструю программу, иллюстрирующую основные проблемы, с которыми я сталкиваюсь:

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

typedef struct {
        int a;
        int b;
} myStruct;

void getData(int* count, myStruct** data) {
    *count = 5;
    *data = malloc(*count * sizeof(myStruct));

    int i;
    for (i = 0; i < *count; i++) {
        data[i]->a = i;
        data[i]->b = i * 2;
        printf("%d.a: %d\n", i, data[i]->a);
        printf("%d.b: %d\n", i, data[i]->b);
    }
}

int main() {
    int count;
    myStruct* data;
    getData(&count, &data);
    return 0;
}

Вывод, который я получаю из этого:

0.a: 0
0.b: 0
Segmentation fault

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

Любая помощь будет очень цениться.

1 Ответ

6 голосов
/ 23 октября 2011

Ошибка здесь:

for (i = 0; i < *count; i++) {
    data[i]->a = i;
    data[i]->b = i * 2;
    printf("%d.a: %d\n", i, data[i]->a);
    printf("%d.b: %d\n", i, data[i]->b);
}

Вы должны сделать это:

for (i = 0; i < *count; i++) {
    (*data)[i].a = i;
    (*data)[i].b = i * 2;
    printf("%d.a: %d\n", i, (*data)[i].a);
    printf("%d.b: %d\n", i, (*data)[i].b);
}

Причина в том, что вы индексируете неправильное «измерение» data.

...