C структурами прямой ссылки - 1) должен быть с указателем? 2) должны быть инициализированы?

Я пытаюсь перенаправить ссылку на (вложенную) структуру в C.

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

Если я объявляю вложенную структуру как указатель и инициализирую ее значениями, она работает.

Следующий код работает:

#include <stdio.h>

struct computer{
    double cost;
    int year;
    char cpu_type[16];
    struct cpu_speed *sp; //this is the question (1)
};

struct cpu_speed{
    int num;
    char type[16];
};

typedef struct computer SC;
typedef struct cpu_speed SS;

void DataR(SC *s);
void DataP(SC *s);

int main(){
   // this is question (2)
    SS speed = {4,"giga"};    
    SC model[2] = {
    { 0,1990, "intel", &speed},
    { 0,1990, "intel", &speed}
    };

    int i;
    for(i=0;i<2;i++) {
        printf("computer no. %d \n", i+1);
        DataR(&model[i]);
    }
    printf("here's what you entered: \n");
    for(i=0;i<2;i++) {
        printf("computer no. %d \n", i+1);
        DataP(&model[i]);
    }
    return 0;
}

void DataR(SC *s){
    printf("the cost of your computer: ");
    scanf("%lf", &s->cost);
    printf("the year of your computer: ");
    scanf("%d", &s->year);
    printf("the type of cpu inside your computer: ");
    scanf("%s", s->cpu_type);
    printf("the speed of the cpu: ");
    scanf("%d %s", &(s->sp->num), s->sp->type);

}

void DataP(SC *s){

    printf("the cost: %.2lf\n",s->cost); 
    printf("the year: %d\n",s->year); 
    printf("the cpu type: %s\n",s->cpu_type); 
    printf("the cpu speed: %d %s\n",s->sp->num, s->sp->type);
}

Если я объявляю вложенную структуру (т.е. struct cpu_speed{...};) перед родительской (?) структурой, мне не нужно использовать указатель, и мне также не нужно инициализировать.

Имея в виду:

(1) я могу использовать struct cpu_speed speed; вместо struct cpu_speed *sp;, (2) Мне не нужно давать инициализированные значения переменным структур.

Мои вопросы еще раз - в структуре прямой ссылки - (1) вы должны объявить это с указателем? и (2) вы должны инициализировать значения?

1 ответ

Решение

Структуры используются только компилятором для выравнивания вашей памяти. Таким образом, он должен знать размер членов структуры.

struct foo {
    struct bar *pointer;
};

В этом случае sizeof(pointer) не имеет отношения к bar struct и, следовательно, компилятору не нужно больше ничего знать.

Однако, если вы хотите добавить bar структурировать foo структура, это нужно знать о своих отдельных членов.

struct bar {
    const char *string;
    uint64_t integer;
};

struct foo {
    struct bar sub;
};

Вы должны объявить bar структурировать перед foo потому что компилятор должен знать, что вы имеете в виду. Иначе как бы он узнал, что делать с этим (нелегальным) кодом:

struct bar {
    struct foo sub;
};

struct foo {
    struct bar sub;
};
Другие вопросы по тегам