C语言考试的一些问题!!!急问
要考试了,请各位强人帮忙做一些题目,并解释下为什么,谢谢.
1. 【 】ER模型可以转换成关系模型。当两个实体间联系是 M:N 联系时,它通常可转换成多少各个关系模式:
A. A. 2
B. 3
C. M+N
D. M*N
2. 【】若已定义x和y为double类型,则表达式:x=1,y=x+3/2的值是
A、1
B、2
C、2.0
D、2.5
3. 【 】在32位的操作系统中,下面一段语句定义了两个结构
#pragma pack(1)
typedef struct
{
char a;
int b;
}fisrtstruc;
#pragma pack(2)
typedef struct
{
char a;
int b;
}secondstruc;
则sizeof(fisrtstruc)和sizeof(secondstruc)分别为:
A. 6,8
B. 5, 6
C. 5, 8
D. 6, 5
4. 【 】在32位系统下,局部变量在堆栈上顺序排列,下面函数的执行结果为:
int func()
{
int a1;
char a2[4];
int a3;
a1 = 5;
a3 = 6;
memset(a2,0x2, 5);
return (a1+a3);
}
A. 0x8
B. 0x7
C. 0xb
D. 0x02000005
E. 0x02000006
[解决办法]
2 C
3 C
[解决办法]
3题选B。
#pragma pack(1) 声明按一字节对齐,所以结构体fisrtstruc在内存空间是按字节连续存储的,不存在补齐的情况。
#pragma pack(1) 声明按二字节对齐,结构体secondstruc在内存空间的存储情况是:第一个char类型的占一个字节,紧接着补齐一个字节,而他的第二个成员为int,占4字节,故最终为6字节。
[解决办法]
1D,属于数据库的知识,联系是多对多的,对每个实体1可以有N个实体2对应,而一共有M个实体1,故一共有M*N个关系。
2C,除法中有浮点型的时候除后的结果也是浮点型的。
3B,#pragma pack(n)定义的是对齐方式,#pragma pack(1)就是以1字节为单位对齐,那就是本来占用的字节,sizeof(char)=1,在32位系统中sizeof(int)=4,结果就为5;,#pragma pack(2)就是以两字节对齐,本来是占用5位,不过为了对齐要空出一位。
4A,在windows系统中,栈从高地址向低地址分配,因此这个程序中栈的结果是:a1,a2[3],a2[2],a2[1],a2[0],a3(从高地址到低地址),memset(a2,0x2, 5)是将a2的5个元素都赋值为2,但是a2就4个元素,这时a1就是实际上的a[4],故a1被改为2,所以a1+a3=8.
[解决办法]
2 B
因为 3 2 是两个int,先计算 3/2 =1
于是最后为2
3
char 1byte
32位系统 int 相当于 long 是4byte
加上#pragma pack(1) 1字节对齐,就没有附加
2字节对齐,这样char占用了2byte 于是就是 6byte了
4
内存
a1=5
a3 a2 a1
| |05
a3=6
06| |05
memset(a2,0x2,5) // 越出范围污染到a1了
06|02|02|02...
VC下debug,可以在watch窗写 &a1,m &a2,m &a3,m 来查看内存 :)