2014年电子科大C语言复试笔试解析:内存管理与字符串交换

需积分: 0 1 下载量 116 浏览量 更新于2024-06-30 收藏 556KB DOCX 举报
"这篇资源是关于2014年电子科技大学C语言复试的笔试题目,主要涉及C语言中常量的存储位置以及程序中错误的识别与修正,特别是内存管理和字符串交换的问题。" 在C语言中,常量的存储位置主要有以下几个区域: 1. **栈区(Stack)** - 这是程序运行时自动分配和释放的空间,通常用于存储局部变量、函数参数等。一旦函数执行完毕,这部分内存会被自动回收。 2. **堆区(Heap)** - 程序员通过`malloc`、`calloc`、`realloc`等函数动态申请的内存位于堆区。程序员负责释放这些内存,如果不释放,程序结束时操作系统可能会回收,但如果程序持续运行,这部分内存就可能导致内存泄漏。 3. **全局区(静态区)(Static)** - 全局变量和静态变量存储在这里。这些变量在整个程序运行期间都存在,即使函数执行完毕也不会消失。 在提供的部分题目中,提到了一个典型的内存管理错误: ```c Int *p, *q; p = (int*)malloc(sizeof(int)*20); q = (int*)malloc(sizeof(int)*10); ... q = p; // 错误,可能导致内存泄漏和重复释放 ... free(p); free(q); // 错误,因为p=q后,释放了同一块内存两次 ``` 在这个例子中,`free(q)`会导致错误,因为`p`和`q`现在指向同一块内存,`free(p)`已经释放了这块内存,再次调用`free(q)`就会尝试释放已经被释放的内存,这将引发错误。同时,由于`p=q`,原本由`p`分配的内存没有被释放,造成了内存泄漏。 关于交换两个字符串的问题,原始代码存在错误: ```c Void swap(char* p, char* q) { char* temp; *temp = *p; *p = *q; *q = *temp; } ``` 这里的问题包括: 1. `Void`应改为`void`,因为关键字`void`首字母小写。 2. `char* temp;`声明了一个未初始化的指针,直接使用`*temp`会引发未定义行为。正确的做法是分配一块足够大的内存来保存字符串,如使用`char temp[100];`,然后使用`strcpy`函数安全地交换字符串内容。 正确的代码实现应如下所示: ```c void swap(char* p, char* q) { char temp[100]; strcpy(temp, p); strcpy(p, q); strcpy(q, temp); } ``` 这个修正后的版本创建了一个临时缓冲区`temp`来安全地交换两个字符串的内容,避免了指针操作的复杂性和潜在的风险。 内存泄漏是程序开发中常见的问题,可能导致系统性能下降甚至程序崩溃。良好的编程习惯,如及时释放不再使用的内存,以及使用智能指针(在C++中)可以帮助减少内存泄漏的发生。对于大型项目,使用内存分析工具也能有效地检测和定位内存泄漏问题。