面试题答案
一键面试- 正确分配内存:
- 静态分配:
在栈上静态分配一个包含10个struct student students[10];
struct student
结构体元素的数组。这种方式简单直接,适合在函数内部使用,并且数组的生命周期与函数相同。 - 动态分配:
使用struct student *students = (struct student *)malloc(10 * sizeof(struct student)); if (students == NULL) { // 处理内存分配失败 perror("malloc"); return -1; }
malloc
函数在堆上动态分配内存,malloc
函数返回一个指向分配内存起始地址的指针,需要强制类型转换为struct student *
类型。分配成功后返回的指针指向一个连续的内存区域,足够存储10个struct student
结构体。使用完动态分配的内存后,要记得释放:free(students); students = NULL;
- 静态分配:
- 可能遇到的错误及避免方法:
- 内存分配失败:
- 错误描述:
malloc
函数可能因为系统内存不足等原因无法分配所需大小的内存,此时会返回NULL
。如果程序继续使用这个NULL
指针,会导致未定义行为,例如段错误。 - 避免方法:在调用
malloc
后,立即检查返回值是否为NULL
。如上述动态分配代码中,当students == NULL
时,使用perror
输出错误信息并做相应处理,如返回错误码或结束程序。
- 错误描述:
- 内存泄漏:
- 错误描述:如果动态分配的内存没有被释放(例如在程序中有多个
return
语句,部分分支没有释放内存),就会造成内存泄漏,随着程序运行,系统可用内存会逐渐减少。 - 避免方法:确保在不再需要动态分配的内存时,及时调用
free
函数释放内存。并且在释放后,将指针设置为NULL
,防止出现野指针(指向已释放内存的指针)。如上述代码中,释放内存后将students
设置为NULL
。
- 错误描述:如果动态分配的内存没有被释放(例如在程序中有多个
- 内存越界:
- 错误描述:无论是静态还是动态分配的数组,如果访问数组元素时索引超出范围(例如
students[10]
,数组合法索引是0
到9
),就会导致未定义行为,可能破坏其他数据或者导致程序崩溃。 - 避免方法:在访问数组元素时,确保索引值在合法范围内。在对数组进行循环操作时,要仔细检查循环条件,避免出现索引越界的情况。
- 错误描述:无论是静态还是动态分配的数组,如果访问数组元素时索引超出范围(例如
- 内存分配失败: