首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C前向引用结构- 1)必须带有指针? 2)必须初始化?

C前向引用结构- 1)必须带有指针? 2)必须初始化?
EN

Stack Overflow用户
提问于 2016-07-22 18:46:14
回答 1查看 55关注 0票数 1

我正在尝试向前引用一个(嵌套的)结构,用C编写。

这意味着我有一个结构,在其中我引用了另一个稍后声明的结构。

如果我将嵌套结构声明为指针,并使用值对其进行初始化,则可以正常工作。

下面的代码可以工作:

代码语言:javascript
复制
#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 *sp;而使用struct cpu_speed speed;。(2)我不需要给结构变量赋予初始化值。

我的问题又来了--在前向引用结构中-- (1)你必须用指针来声明它吗?和(2)你必须初始化值吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-22 18:51:30

结构仅供编译器用来对齐内存。因此,它需要知道结构成员的大小。

代码语言:javascript
复制
struct foo {
    struct bar *pointer;
};

在这种情况下,sizeof(pointer)bar结构无关,因此编译器不需要知道更多信息。

但是,如果要将bar结构添加到foo结构中,它确实需要了解其各个成员。

代码语言:javascript
复制
struct bar {
    const char *string;
    uint64_t integer;
};

struct foo {
    struct bar sub;
};

您需要在foo之前声明bar结构,因为编译器需要知道您引用的是什么。否则,它如何知道如何处理这个(非法)代码:

代码语言:javascript
复制
struct bar {
    struct foo sub;
};

struct foo {
    struct bar sub;
};
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38524504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档