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;
};