C语言笔试题解析:局部变量、全局变量、内存分配与类型大小

需积分: 44 119 下载量 60 浏览量 更新于2024-08-07 收藏 928KB PDF 举报
"这是一份关于C语言的程序分析题,包含了面试题和经典编程例题,主要涉及内存管理、数据类型、运算符优先级、结构体与联合体的使用,以及动态内存分配等知识点。" 1. **局部变量、全局变量与动态内存** - 局部变量在函数内部定义,它们存储在栈区,当函数执行完毕后会被自动释放。 - 全局变量在整个程序执行期间都存在,存储在数据区。 - 动态申请的数据使用`malloc`、`calloc`或`realloc`等函数获取,存储在堆区,需要程序员手动释放。 2. **数据类型与内存大小** - `union DATE`中,最大的成员是`int k[5]`,占用20个字节,因此`UNION DATE`的大小是20字节。 - `struct data`中,各成员分别占用空间:`int`是4字节,`DATE`是20字节,`double`是8字节,所以结构体`struct data`的大小是4 + 20 + 8 = 32字节。 - 因此,`printf("%d", sizeof(struct data) + sizeof(max))`的执行结果是52。 3. **指针运算** - 在32位系统中,`unsigned char *p1`增加5会按字节增加,所以`p1+5`等于`0x801005`。 - 而`unsigned long *p2`增加5会按`long`类型字节数增加,通常`long`是4字节,所以在32位系统中`p2+5`等于`0x810014`。 4. **运算符优先级** - 表达式`k *= i + j`中,先计算`i + j`得到20,然后`k`乘以20,最终`k`的值是60。 5. **宏定义** - `#define DOUBLE(x) x + x`这个宏定义将`DOUBLE(5)`替换为`5 + 5`,所以`i = 5 * DOUBLE(5)`的结果是`i = 5 * 10 = 30`。 6. **动态内存分配** - 当`malloc(0)`返回非空指针时,虽然没有分配到内存,但条件判断`(ptr=(char*)malloc(0))==NULL`失败,程序将输出`Got a valid pointer`。 7. **字符编码与ASCII码** - 字符`m`被赋值为`'B' + 32`,在ASCII码表中,`'B'`是66,加上32等于98,对应字符`'b'`,所以输出是`b`。 8. **动态内存分配的使用** - 使用`malloc`为`struct node`类型分配内存,正确填写的语句应为`p = (struct node *)malloc(sizeof(struct node));`,这样确保了分配足够的内存来存放`struct node`类型的数据。 这些题目涵盖了C语言的基础知识,包括内存管理、数据类型、运算符优先级、结构体与联合体、指针运算以及宏定义等,对于学习和复习C语言非常有帮助。