第37练 单元8 动态内存分配《C语言程序设计》(高教版第2版)一课一练

| 2份
| 7页
| 26人阅读
| 0人下载

内容正文:

编写说明:考虑到中职学生普遍基础知识相对薄弱的情况,我们依据支架式教学理念,精心编制了《C语言程序设计》(高教版第2版)一课一练。专辑里的每一份练习,都与课堂所授知识点紧密相关,题目围绕课堂所学知识点呈现。目的在于激发学生的学习兴趣,培养他们的学习自觉性,帮助学生扎实掌握课程的基本概念与基本方法,为他们后续的进一步提升奠定坚实基础。 本卷是《C语言程序设计》(高教版第2版)一课一练的单元8的第37练,内容涵盖单元8“考试系统”的优化的8.2.7动态内存分配。 《C语言程序设计》(高教版第2版)一课一练 第37练 单元8 “考试系统”的优化 8.2.7 动态内存分配 1、 单项选择题(本题共5小题) 1、C 语言中动态内存分配的存储空间位于( ) A. 栈区 B. 静态存储区 C. 堆区 D. 代码区 2、下列函数中,专门用于释放动态分配内存的是( ) A. malloc () B. calloc () C. free () D. realloc () 3、关于 malloc 和 calloc 函数的核心区别,描述正确的是( ) A. malloc 会自动初始化内存为 0,calloc 不会 B. calloc 会自动初始化内存为 0,malloc 不会 C. 两者都需要手动初始化内存为 0 D. 两者都不需要初始化内存 4、下列关于 void 指针的说法,正确的是( ) A. void 指针可以直接用运算符访问指向的内存内容 B. void 指针是指向空类型的指针,需强制类型转换后才能指向特定类型数据 C. void 指针不能转换为其他类型的指针 D. void 指针只能指向字符类型数据 5、使用 malloc 函数申请动态内存时,若申请失败,函数的返回值是( ) A. 0 B. NULL C. 随机内存地址 D. -1 2、 判断题(本题共4题) 1、动态分配的内存会在函数执行结束后自动释放。( ) 2、calloc 函数申请的内存空间会自动初始化为 0。( ) 3、void 指针可以直接用运算符访问指向的内存内容。( ) 4、使用 realloc 函数调整内存大小时,原内存中的数据会自动保留到新的内存空间中。( ) 3、 程序填空题(本题共1题) 1、题目描述:以下程序通过动态内存分配存储 5 个学生的成绩,计算并输出最低分,请补充缺失代码; #include <stdio.h> #include <stdlib.h> #define STUDENT_COUNT 5 int main() { // 定义指向整型的指针,初始化为空 int *scores = NULL; int min_score, i; // 1. 动态申请STUDENT_COUNT个整型的内存空间 scores = (1)____; // 2. 判断内存申请是否成功 if( (2)____ ) { printf("内存申请失败,程序终止! "); return 1; } printf("请输入%d个学生的成绩: ", STUDENT_COUNT); for(i=0; i<STUDENT_COUNT; i++) { // 3. 通过指针访问动态数组元素,接收输入 scanf("%d", (3)____); } // 初始化最低分为第一个学生的成绩 min_score = *scores; for(i=1; i<STUDENT_COUNT; i++) { if( *(scores+i) < min_score ) { min_score = *(scores+i); } } printf("最低分:%d ", min_score); // 4. 释放动态分配的内存 (4)____; // 5. 将指针置空,避免野指针 (5)____; return 0; } 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $ 编写说明:考虑到中职学生普遍基础知识相对薄弱的情况,我们依据支架式教学理念,精心编制了《C语言程序设计》(高教版第2版)一课一练。专辑里的每一份练习,都与课堂所授知识点紧密相关,题目围绕课堂所学知识点呈现。目的在于激发学生的学习兴趣,培养他们的学习自觉性,帮助学生扎实掌握课程的基本概念与基本方法,为他们后续的进一步提升奠定坚实基础。 本卷是《C语言程序设计》(高教版第2版)一课一练的单元8的第37练,内容涵盖单元8“考试系统”的优化的8.2.7动态内存分配。 《C语言程序设计》(高教版第2版)一课一练 第37练 单元8 “考试系统”的优化 8.2.7 动态内存分配 1、 单项选择题(本题共5小题) 1、C 语言中动态内存分配的存储空间位于( ) A. 栈区 B. 静态存储区 C. 堆区 D. 代码区 【答案】C 【解析】动态内存分配是在堆区进行的,栈区用于存储非静态局部变量(自动分配释放),静态存储区存储全局变量和 static 变量,代码区存储程序执行指令。 2、下列函数中,专门用于释放动态分配内存的是( ) A. malloc () B. calloc () C. free () D. realloc () 【答案】C 【解析】malloc () 和 calloc () 用于申请动态内存,realloc () 用于调整已分配内存的大小,free () 唯一作用是释放堆区动态分配的内存,避免内存泄漏。 3、关于 malloc 和 calloc 函数的核心区别,描述正确的是( ) A. malloc 会自动初始化内存为 0,calloc 不会 B. calloc 会自动初始化内存为 0,malloc 不会 C. 两者都需要手动初始化内存为 0 D. 两者都不需要初始化内存 【答案】B 【解析】calloc 函数在分配内存时会将所有字节初始化为 0,而 malloc 分配的内存是随机的垃圾值,需要手动初始化后才能安全使用。 4、下列关于 void 指针的说法,正确的是( ) A. void 指针可以直接用运算符访问指向的内存内容 B. void 指针是指向空类型的指针,需强制类型转换后才能指向特定类型数据 C. void 指针不能转换为其他类型的指针 D. void 指针只能指向字符类型数据 【答案】B 【解析】void 指针是不确定类型的指针,无法确定访问内存的字节大小,必须先强制转换为 int、double * 等特定类型指针,才能操作指向的内存;它可以转换为任何类型的指针。 5、使用 malloc 函数申请动态内存时,若申请失败,函数的返回值是( ) A. 0 B. NULL C. 随机内存地址 D. -1 【答案】B 【解析】malloc 申请内存失败时会返回空指针 NULL,必须判断该返回值,避免后续对空指针的非法访问导致程序崩溃。 2、 判断题(本题共4题) 1、动态分配的内存会在函数执行结束后自动释放。( ) 【答案】× 【解析】动态分配的内存位于堆区,不会随函数结束自动释放,必须手动调用 free () 函数释放,否则会造成内存泄漏,长期运行会耗尽系统内存。 2、calloc 函数申请的内存空间会自动初始化为 0。( ) 【答案】√ 【解析】calloc 的功能是分配 num 个 size 大小的连续内存,并将每个字节的内容初始化为 0,适合需要初始化为 0 的场景。 3、void 指针可以直接用运算符访问指向的内存内容。( ) 【答案】× 【解析】void 指针没有确定的指向类型,编译器无法知道访问内存的字节长度,必须先强制转换为特定类型的指针,才能用运算符读取或修改内存内容。 4、使用 realloc 函数调整内存大小时,原内存中的数据会自动保留到新的内存空间中。( ) 【答案】√ 【解析】realloc 会将原内存中的数据复制到新的内存空间(若调整后的空间更大);若缩小内存,则保留前 size 字节的数据。需注意:若新内存申请失败,原内存不会被释放。 3、 程序填空题(本题共1题) 1、题目描述:以下程序通过动态内存分配存储 5 个学生的成绩,计算并输出最低分,请补充缺失代码; #include <stdio.h> #include <stdlib.h> #define STUDENT_COUNT 5 int main() { // 定义指向整型的指针,初始化为空 int *scores = NULL; int min_score, i; // 1. 动态申请STUDENT_COUNT个整型的内存空间 scores = (1)____; // 2. 判断内存申请是否成功 if( (2)____ ) { printf("内存申请失败,程序终止! "); return 1; } printf("请输入%d个学生的成绩: ", STUDENT_COUNT); for(i=0; i<STUDENT_COUNT; i++) { // 3. 通过指针访问动态数组元素,接收输入 scanf("%d", (3)____); } // 初始化最低分为第一个学生的成绩 min_score = *scores; for(i=1; i<STUDENT_COUNT; i++) { if( *(scores+i) < min_score ) { min_score = *(scores+i); } } printf("最低分:%d ", min_score); // 4. 释放动态分配的内存 (4)____; // 5. 将指针置空,避免野指针 (5)____; return 0; } 【答案】 (1) (int*) malloc (STUDENT_COUNT * sizeof (int)) (2) scores == NULL (3) scores + i 或 &scores [i] (4) free (scores) (5) scores = NULL 【解析】 (1) 使用 malloc 申请内存,需将返回的 void 指针强制转换为 int类型,结合 sizeof (int) 计算每个整型的字节数,保证代码在不同编译器下的兼容性; (2) 判断指针是否为 NULL,若为 NULL 说明内存申请失败,需终止程序避免非法访问; (3) scores+i 是动态数组第 i 个元素的地址,等价于 & scores [i],可直接作为 scanf 的参数接收用户输入; (4) 调用 free () 函数释放动态内存,避免内存泄漏; (5) 将指针置为 NULL,防止后续误操作野指针(指向已释放内存的指针),提高程序安全性。 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $

资源预览图

第37练 单元8 动态内存分配《C语言程序设计》(高教版第2版)一课一练-第1页
1

由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。