1、设有下面的结构体和结构变量定义:
struct student
{
int id;
char *name;
int math;
};
关于结构体类型变量赋值正确的是()
A、 studl.id=1001; studl.name=”Tom”;
B、 id=1001; *studl.name=”Tom”;
C、 studl.id=1001; studl.*name=”Tom”;
D、 studl.id=1001L; *studl.name=”Tom”;
//A是正确的,结构体内有字符指针时,直接使用结构体的引用给字符指针指向一个字符串。
2、指向结构体对象的指针变量既可以指向结构体变量,也可以用来指向()。
//
2.1结构体类型只有一种。请问这句话的说法是正确的吗?
A. 正确
B. 错误
//错误,结构体的类型不只有一种,因为结构体的名称不同时,即为一种不同的结构体。
3、当说明一个结构体变量时系统分配给它的内存是()
A. 各成员所需内存的总和
B. 结构中第一个成员所需内存量
C. 成员中占内存量最大者所需的容量
D. 结构中最后一个成员所需内存量
//各成员变量所占的内存和,最后组成了结构体所占空间的内存。
4、在结构体中,成员的缺省存取权限是 1 有的.
//结构体中,各成员变量是公开的,所以,我们定义一个结构体时,可以随便调用。
5、在32位cpu上选择缺省对齐的情况下,有如下结构体定义:
struct A{
unsigned a : 19;
unsigned b : 11;
unsigned c : 4;
unsigned d : 29;
char index;
};
则sizeof(struct A)的值为(C)
9
• 12
• 16
• 20
//位结构,在4字节里边,a首先占用了19个字节,b又来占用剩下的32-19=13个字节,发现可以容纳,之后就占用了。c来了,发现之前4个字节的空间只剩下了两位,所以c默默地又让编译器给它分配了4个字节的空间,它就把前4位占了。d来了很吐血,c占了它要的4个字节的4位,但是剩下那么多空的,d又占不下,它也向编译器申请了4字节空间,所以d占用了它申请的4字节空间里边的29位。最后一个成员index来了,他申请了字节的空间,但是之后的编译器又来了,发现它们不齐,之后给index之后添加了3个字节的空间,最后就成了16个字节的空间占用。
6、下列代码的功能包括:定义一个x数组,说明一个结构体,同时对变量t进行初始化,使得t的a成员的值为50,b成员的值为x数组的首地址。
请在空白处(方框内)填入合适的内容,一完成上述功能。
1
2
3
4
5
int x[5]={1,2,3,4,5};
struct {
int a;
int *b;
}t{ (50),(x) };
7、开发C代码时,经常见到如下类型的结构体定义:
typedef struct list_t
{
struct list_t *next;
struct list_t *prev;
char data[0];
}list_t;
请问在32位系统中,sizeof(list_t)的值为?
4byte
• 8byte
• 5byte
• 9byte
//两个指针,两个四字节大小的内存。char data[0],编译器默认为柔性数组没有给内存。所以为8
8、定义一个结构体变量(包括年、月、日),计算该日在本年中为第几天?(注意考虑闰年问题),要求写一个函数days,实现上面的计算。由主函数将年月日传递给days函数,计算后将日子传递回主函数输出 。
#include <stdio.h>
typedef struct Time
{
int year;
int mouth;
int day;
}T,*Tp;
void Set_time(Tp t);