如何在c中声明一个结构?

时间:2014-09-12 13:56:05

标签: c arrays struct initialization

我正在关注此example,我的程序如下:

#include <string.h>
#include <stdio.h>
#include <stdlib.h> 

struct Foo
{
    int x;
    int array[100];
}; 


struct Foo f;
f.x = 54;
f.array[3]=9;

void print(void){

    printf("%u", f.x);
}

int main(){
    print();
}

但是,使用make example_1编译时出现错误:

example_1.c:13:1: error: unknown type name 'f'
f.x = 54;
^
example_1.c:13:2: error: expected identifier or '('
f.x = 54;
 ^
example_1.c:14:1: error: unknown type name 'f'
f.array[3]=9;
^
example_1.c:14:2: error: expected identifier or '('
f.array[3]=9;
 ^
4 errors generated.
make: *** [example_1] Error 1 

这个struct声明有什么问题?

2 个答案:

答案 0 :(得分:6)

f.x = 54;
f.array[3]=9;

应该在一些功能里面。除了初始化之外,您不能在全局范围内编写函数外的程序流。

要全局初始化,请使用

struct Foo f = {54, {0, 0, 0, 9}};

live code here

在C99中,你也可以写

struct Foo f = {.x=54, .array[3] = 9 };

live code here


您提到的示例链接说:

  

struct Foo f; //自动分配,所有字段都放在堆栈上   
f.x = 54; {
{1}}

使用文字堆栈表明它开始在如下的本地函数中使用:

f.array[3]=9;

live example here

答案 1 :(得分:2)

您只能在其变形点处初始化结构变量。

您可以像这样初始化它:

struct Foo f = {54, {0, 0, 0 9}};

或使用C99功能designated initializers

struct Foo f = {.x = 54, .array[3] = 9};

第二种方法是更清晰但不幸的是C99并不像C89那样广泛使用。 GNU编译器完全支持C99。 Microsoft的编译器不支持C89以上的任何C标准。 C ++也没有这个功能。

因此,如果您希望使用C ++编译器或Microsofts C编译器编译代码,则应使用第一个版本。如果您仅仅为gcc编写代码而不是微软的开发工具,那么您可以使用第二个版本。

您还可以在函数中单独指定每个成员:

void function(void)
{
    f.x = 54;
    f.array[3] = 9;
}

但你不可能全球化。