结构体成员变量在内存中是连续存放的吗
structs{intb;intx,y;char*p;inta[10];}s1={2,1,3,"abc",{9,8,7,6}};intmain(intargc,char*...
struct s
{
int b;
int x,y;
char *p;
int a[10];
}s1={2,1,3,"abc",{9,8,7,6}};
int main(int argc, char *argv[])
{
printf("%p,%p,%p,%p,%p,%p,%p,%p",&s1.b,&s1.x,&s1.y,s1.p,s1.a,&s1.a[0],&s1.a[1],&s1.a[2]);
return 0;
}
我不知道我上面写的程序有没问题,我在网上看到有人说结构体成员变量在内存中是连续存放的,也有说不是的。
我上面的程序显示应该不是连续存放的,但我现在有疑问:那我如果定义结构体数组,(数组在内存中连续分配),那岂不是矛盾了 展开
{
int b;
int x,y;
char *p;
int a[10];
}s1={2,1,3,"abc",{9,8,7,6}};
int main(int argc, char *argv[])
{
printf("%p,%p,%p,%p,%p,%p,%p,%p",&s1.b,&s1.x,&s1.y,s1.p,s1.a,&s1.a[0],&s1.a[1],&s1.a[2]);
return 0;
}
我不知道我上面写的程序有没问题,我在网上看到有人说结构体成员变量在内存中是连续存放的,也有说不是的。
我上面的程序显示应该不是连续存放的,但我现在有疑问:那我如果定义结构体数组,(数组在内存中连续分配),那岂不是矛盾了 展开
展开全部
像这么加不对哦,每次进入循环,stu[N].a就被清零一次,以前加的和都没有了。。。
for(i=0;i<N;i++)
{
stu[N].a=0;
stu[N].a+=stu[i].a;
}
像这样,在初始化的时候清零就可以了:
for(i=0,stu[N].a=0;i<N;i++)
{
stu[N].a+=stu[i].a;
}
还有这一句:
scanf("%d%s%d%d%d",&stu[i].num,&stu[i].name,&stu[i].a,&stu[i].b,&stu[i].c);
name是字符数组,name已经是数组的头地址了,就不用取地址符了。应该是这么写
scanf("%d%s%d%d%d",&stu[i].num,stu[i].name,&stu[i].a,&stu[i].b,&stu[i].c);
至于楼主要的求和函数。楼主这结构体只能这么写了。。。
int Sum(int mod)
{
int sum=0;
if(mod==1)
for(i=0,stu[N].a=0;i<N;i++)
sum+=stu[i].a;
else if(mod==2)
for(i=0,stu[N].a=0;i<N;i++)
sum+=stu[i].b;
else
for(i=0,stu[N].a=0;i<N;i++)
sum+=stu[i].c;
return sum;
}
这么用
printf("a课程总平均成绩为%d分",Sum(1)/N);
printf("b课程总平均成绩为%d分",Sum(2)/N);
printf("c课程总平均成绩为%d分",Sum(3)/N);
如果楼主的结构体这么定义:
struct student
{
int num;
char name[20];
int score[3];
int sum;
}stu[N+1];
就好写多了
int Sum(int mod)
{
int sum=0;
for(i=0,stu[N].a=0;i<N;i++)
sum+=stu[i].score[mod];
return sum;
}
for(i=0;i<N;i++)
{
stu[N].a=0;
stu[N].a+=stu[i].a;
}
像这样,在初始化的时候清零就可以了:
for(i=0,stu[N].a=0;i<N;i++)
{
stu[N].a+=stu[i].a;
}
还有这一句:
scanf("%d%s%d%d%d",&stu[i].num,&stu[i].name,&stu[i].a,&stu[i].b,&stu[i].c);
name是字符数组,name已经是数组的头地址了,就不用取地址符了。应该是这么写
scanf("%d%s%d%d%d",&stu[i].num,stu[i].name,&stu[i].a,&stu[i].b,&stu[i].c);
至于楼主要的求和函数。楼主这结构体只能这么写了。。。
int Sum(int mod)
{
int sum=0;
if(mod==1)
for(i=0,stu[N].a=0;i<N;i++)
sum+=stu[i].a;
else if(mod==2)
for(i=0,stu[N].a=0;i<N;i++)
sum+=stu[i].b;
else
for(i=0,stu[N].a=0;i<N;i++)
sum+=stu[i].c;
return sum;
}
这么用
printf("a课程总平均成绩为%d分",Sum(1)/N);
printf("b课程总平均成绩为%d分",Sum(2)/N);
printf("c课程总平均成绩为%d分",Sum(3)/N);
如果楼主的结构体这么定义:
struct student
{
int num;
char name[20];
int score[3];
int sum;
}stu[N+1];
就好写多了
int Sum(int mod)
{
int sum=0;
for(i=0,stu[N].a=0;i<N;i++)
sum+=stu[i].score[mod];
return sum;
}
展开全部
根据对齐方式,为1时连续,为2时,如果成员都大于等于2,就能连续小于2,就不连续
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
默认是32位对齐的,就是不管你是一个字节变量还是2个字节变量都占4字节。想要连续要用单字节对齐伪指令
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不一定。
定义结构体数组:
struct s
{
int b;
int x,y;
char *p;
int a[10];
}s1[]={2,1,3,"abc",{9,8,7,6}},s2[12];
或者:
struct s s1[10]; //结构类的数组定义。
定义结构体数组:
struct s
{
int b;
int x,y;
char *p;
int a[10];
}s1[]={2,1,3,"abc",{9,8,7,6}},s2[12];
或者:
struct s s1[10]; //结构类的数组定义。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一个结构体中各个成员是连续的,一个结构体和另一个结构体又是想连续的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询