C语言 初始化结构成员时出错



下面是一个在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时,我得到了一个错误">size没有在作用域中声明">,但是我已经在结构stack中声明了size。我能够以相同的方式初始化top那么为什么会出现错误?

Q2 : 在init方法中,我得到了正确的输出const int size=10。我很困惑,在这个语句中,我们如何能够在不使用结构变量的情况下访问结构size stack的成员,不应该const int s.size=10吗?

s.size=10没有

问题。问题是当你为s.a分配内存时,没有名为size的变量,你应该把它改成:

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

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

是的,因为size是一个结构变量,你必须使用结构变量访问并初始化它。

如果初始化size =10它将作为新变量。 因为 init 函数将存储在单独的堆栈中,而变量 size 的作用域将仅在 init 函数内。然后在分配内存时,您应该为 s.size 变量分配内存。

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

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

  1. 作为结构成员变量
  2. 作为 void init() 中的局部变量。

请注意,这两个是单独的变量。

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

OTOH,void init() 中的int sizeint 类型的正态变量。

如果没有类型struct stack的变量,就不存在属于struct stacksize。同样,您无法在任何地方直接访问size,这是一个struct stack的成员变量[不使用类型struct stack的结构变量]。

总结一下

答案 1:

该错误不是将const int size=10替换为 s.size = 10 。而是从下一行开始,

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

其中,删除const int size=10时不存在size变量。

答案 2

const int size=10声明并定义了一个名为 size 的新变量。它与s.size[struct stack成员]不同。这就是为什么使用

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

有效,因为名为 size 的变量在作用域中。

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

相关内容

  • 没有找到相关文章

最新更新