初始化结构成员时出错

时间:2014-12-20 09:38:37

标签: c struct initialization malloc declaration

以下是程序,用于在c

中初始化结构的成员
struct stack
{
    int *a;
    int top;
    int size;
}s;

void init()
{

    const int size =10; /*s.size=10;*/  /*const int s.size=10*/
    s.a=(int*)malloc(size*sizeof(int));
    s.top=0;    
}

int main()
{
    init();
    printf("Initialization done !\n");
    return 0;   
}

Q1 :当我写init时,const int size=10方法代替s.size=10,我收到错误“大小未在范围中声明< / strong>“,但我已经在size struct中声明了stack。我能够以相同的方式初始化top那么为什么会出错呢?

Q2 :在init方法中,正确输出 const int size=10。我很困惑,在这个语句中我们如何在不使用结构变量的情况下访问结构size的{​​{1}}成员,不应该是stack

4 个答案:

答案 0 :(得分:2)

是的,因为size是结构变量,您必须使用结构变量进行访问并初始化它。

如果您初始化size =10,则会将其作为新变量。因为init函数将存储在一个单独的堆栈中,变量size的范围只在init函数内。 然后在分配内存时,您应该为s.size变量分配。

s.a = malloc(s.size * sizeof(int));

答案 1 :(得分:2)

s.size=10没问题。问题是当您为s.a分配内存时,没有名为size的变量,您应将其更改为:

s.a = malloc(s.size * sizeof(int));

您似乎对结构size中的变量size和成员struct stack s感到困惑,除了具有相同的名称外,它们没有关系。

答案 2 :(得分:0)

我认为,您的困惑是因为您使用了相同的变量名称size两次,

  1. 作为结构成员变量
  2. 作为void init()中的局部变量。
  3. 请注意,这两个是单独的变量。

    size中的struct stack成员变量是结构的成员。您需要通过.->运算符访问成员变量[是的,即使结构是全局的]。

    OTOH,int size中的void init()int类型的正常变量。

    如果没有struct stack类型的变量,则不存在属于size的{​​{1}}。同样,您无法直接访问struct stack size中的成员变量[不使用struct stack类型的结构变量]。

    总结

    回答1:

    错误不是用struct stack替换const int size=10。它来自下一行,

    s.size = 10

    如果删除s.a= malloc(size*sizeof(int)); ^ | ,则不存在size变量。

    回答2

    const int size=10声明并定义一个名为const int size=10的新变量。它与size [{1}}的成员不同。这就是使用

    的原因
    s.size

    有效,因为名为struct stack的变量在范围内。

答案 3 :(得分:0)

Note: the following method of defining/declaring a struct is depreciated
struct stack
{
    int *a;
    int top;
    int size;
}s;

The preferred method is:
// declare a struct type, named stack
struct stack
{
    int *a;
    int top;
    int size;
};

struct stack s;  // declare an instance of the 'struct stack' type

// certain parameters to the compile command can force 
// the requirement that all functions (other than main) 
// have a prototype so:
void init ( void );

void init()
{

    s.size =10;
    // get memory allocation for 10 integers
    if( NULL == (s.a=(int*)malloc(s.size*sizeof(int)) ) )
    { // then, malloc failed
        perror( "malloc failed" );
        exit( EXIT_FAILURE );
    }

    s.top=0;    
} // end function: init