Доступ и установка значений массива в структурах - PullRequest
1 голос
/ 17 февраля 2011

У меня есть такая структура:

typedef struct {
    int sizes[3];
    float **vals[3]; // an array of size 3 of float ** pointers
} mystruct;

Я пытаюсь установить значения этих массивов в функции, которая принимает указатель на mystruct.

void populateStruct(mystruct *s) {
    int i, j, n;

    for (n = 0; n < 3; n++) {
        scanf("%d", &s->sizes[n]);

        // Malloc the float pointers (**vals) based on the scanned sizes
        s->vals[n] = (float **)malloc(s->sizes[n] * sizeof(float *));
        for (i = 0; i < s->sizes[n]; i++)
            s->vals[n][i] = (float *)malloc(s->sizes[n] * sizeof(float));

        // Populate the float "arrays"
        for (i = 0; i < s->sizes[n]; i++) {
            for (j = 0; j < s->sizes[n]; j++) {
                scanf("%f", &s->vals[n][i][j]);
            }
        }
    }
}

Вот как я использую функцию в main:

int main() {
    mystruct *s1;
    populateStructure(s1);
    return 0;
}

Этот код компилируется нормально, но при запуске я получаю ошибку сегмента.Си не моя сильная сторона, поэтому я не слишком уверен, что делаю не так.

Ответы [ 2 ]

1 голос
/ 17 февраля 2011
mystruct *s1; 

s1 - только указатель с непредсказуемым значением. Вы не распределили память для нужной вам структуры. Разыменование дикого (неинициализированного) указателя вызовет segv. Вы можете изменить свой код так:

    mystruct s1;
    populateStructure(&s1);

или

    mystruct *s1 = (mystruct *)malloc(sizeof(mystruct));
    populateStructure(s1);

(не забудьте освободить s1 во втором)

1 голос
/ 17 февраля 2011

Как вы объявляете свою структуру и как вы ее передаете?

В вашей функции, где вы вызываете populateStruct, вы, вероятно, должны объявить s:

как mystruct s and call populateStruct(&s)

или

mystruct *s;
s = malloc(sizeof(mystruct));
populateStruct(s);
...