以下是程序,用于在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
?
答案 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
两次,
void init()
中的局部变量。请注意,这两个是单独的变量。
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