第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,防止后续误操作野指针(指向已释放内存的指针),提高程序安全性。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$