Инициализировать структуры без определения членов структуры - C - PullRequest
0 голосов
/ 04 января 2011

Я пытаюсь расшифровать чей-то код и вижу то, чего не понимаю.Я не вижу ссылок на то, как применяются структуры, когда элементы не определены в заголовке или в начале кода, но определены позже ... Вот пример того, что я пытаюсь выяснить.Я заметил, что Data_t * data;в заголовке не определено, пока мы не введем фанки-функцию и мои ошибки компилятора не появятся в этой строке.Я предполагаю, что мой вопрос будет - это правильный способ ввода данных в структуры?

Большое спасибо!

#include <stdio.h>

typedef struct config{
    int a;
    int b;
    int c;
    Data_t *data;
} config_t;

int funky(config_t *config);

int main( void )
{
    printf("In main()\n");
    config_t config;
    funky(&config);

    printf("a = %d\n", config.a);   //accessing config's a member

    return 0;
}

int funky(config_t *config)
{
    printf("In funky()\n");

    Data_t *dataa = config->data;
    for(i=0;i<5;i++){
        dataa[i].mem1=i;
        dataa[i].mem2=4+i;
    }

    //Set values
    config->a = 1;
    printf("a = %d\n", config->a);  //pointer to config's a member

    return 0;
}

1 Ответ

2 голосов
/ 04 января 2011

Определение Data_t не появляется в вашем коде, что и является причиной ошибки компиляции.

Также - к вашему конкретному вопросу, этот код разыменовывает неинициализированный указатель, который вызывает неопределенное поведение,Инициализируйте поле data в структуре config в main, иначе у вас возникнут проблемы.Этот блок кода:

Data_t *dataa = config->data;
for(i=0;i<5;i++){
    dataa[i].mem1=i;
    dataa[i].mem2=4+i;
}

Это плохой материал - как вы можете видеть, он копирует унитализированный указатель и пытается через него получить доступ к памяти.

Код после этого:

//Set values
config->a = 1;

Прекрасный и вполне разумный способ инициализации структуры.

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