C语言的 小弟迷茫了 N多问题,请大家帮忙.

来源:百度知道 编辑:UC知道 时间:2024/06/15 12:44:34
第一个问题:sizeof()这个函数检测 int a[10]这个数组为什么有的机子上结果是20有的是40?
第二个问题:看看这个程序,sizeof结果为什么是240,具体是怎么算的,请说清楚.
#include <stdio.h>
main()
{
struct record
{
char name[14];
int gm,rm;
}a[10];
int s,m[10];
printf("%d",sizeof(a));
}
第三个问题:有没有C语言的交流群,小弟新学C想加一个.
谢谢大家.

第一个问题:
int a[10] 的长度为20的情况,是说明那台机子的int是16位的,只占两个字节。所以 10 个 int 占 20 个字节。
int a[10] 的长度为40的情况,是说明那台机子的int是32位的,占四个字节。所以 10 个 int 占 40 个字节。

在现有的32们操作系统下,一般int都占4个字节,所以一般情况下 int a[10]的内存长度为40字节。

第二个问题:
这是一个数据内存对齐和结构体整体的问题。
一般情况下,结构体对齐设置为4。数据成员内存对齐则跟具体的数据类型的关系。

拿你这个代码中的
struct record
{
char name[14];
int gm,rm;
}a[10];
为说,

为了方便,我们分开写。

struct record
{
char name[14];
int gm;
int rm;
}a[10];

因为结构体整体对齐的缘故,所以这个结构体的起始内存,肯定是4的倍数。
你可以用一行代码来测试:
printf( "start address of a: %08X, mod 4 = %d\n", a, ( ( unsigned int ) a ) % 4 );

看看输出结果。 a 的地址对 4 求余,肯定是0。

我们令 addressA 为 a 的起始地址。
那么必然有 addressA % 4 为 0

第一个成员,是 name[14],因为 name 是 char 型,只占一字节,所以它的开始位置对齐为1,所以不用偏移。因为它有14个无素,所以占14个字节。

接下来的成员,应该就是 int gm;了,但是因为 gm 是 int 型,所以它也要求起始地址为 4 的整数倍。

但是因为前面是 14 个字节,addressA,那就是 addr