下面是一个在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
两次使用相同的变量名,
- 作为结构成员变量
- 作为
void init()
中的局部变量。
请注意,这两个是单独的变量。
struct stack
中的size
成员变量是结构的成员。您需要通过.
或->
运算符访问成员变量 [是的,即使结构是全局的]。
OTOH,void init()
中的int size
是 int
类型的正态变量。
如果没有类型struct stack
的变量,就不存在属于struct stack
的size
。同样,您无法在任何地方直接访问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