前言:
在上章节中解说了动态内存的概念和管理的焦点函数。
在本章节继承为大家介绍动态内存的常见错误,让大家更好的明白运用。
补充:利用内存函数必要头文件<stdlib.h>
对NULL指针的解引用操纵
- 当利用malloc、calloc或realloc等函数分配内存时,假如返回值为NULL(表示分配失败),直接对NULL指针进行解引用会导致程序瓦解。例如:
- int *p = (int*)malloc(10 * sizeof(int));
- if (p == NULL)
- {
- // 处理分配失败的情况
- }
复制代码
正确的做法是先检查返回值是否为NULL,避免直接利用指针。
越界访问
在访问动态分配的内存时,假如超出分配的范围,大概会导致程序瓦解或未界说活动。
例如:
- int *arr = (int*)malloc(5 * sizeof(int));
- for (int i = 0; i <= 5; i++)
- {
- arr[i] = i; // 越界访问
- }
- free(arr);
复制代码 解决方法是确保访问的索引在有效范围内。
开释非动态分配的内存
利用free函数开释非动态分配的内存(如栈上分配的内存)会导致未界说活动。例如:
- int arr[10];
- free(arr); // 错误:释放栈上分配的内存
复制代码 应确保只对动态分配的内存调用free。
重复开释内存(双重开释)
假如对同一块内存多次调用free函数,会导致程序瓦解或未界说活动。例如:
- int *ptr = (int*)malloc(10 * sizeof(int));
- free(ptr);
- free(ptr); // 错误:双重释放
复制代码 开释部门内存
假如尝试开释动态分配内存的一部门,会导致未界说活动。例如:
- int *ptr = (int*)malloc(10 * sizeof(int));
- free(ptr + 2); // 错误:释放部分内存
复制代码 正确的做法是开释整个内存块。
- int main()
- {
- int* p = (int*)malloc(40);
- if (p == NULL)
- {
- perror("malloc");
- return 0;
- }
- int i = 0;
- for (i = 0;i < 10;i++)
- {
- *p = 5;
- p++;
- }
- free(p);
- p = NULL;
- return 0;
- }
复制代码
未初始化的指针利用
利用未初始化的指针大概导致程序瓦解或访问非法内存。例如:
- int *ptr;
- printf("%d\n", *ptr); // 错误:未初始化的指针
复制代码 指针在利用前应确保已正确初始化。
内存泄漏
假如分配的内存未被开释,会导致内存泄漏。
例如:
- int *ptr = (int*)malloc(10 * sizeof(int));
- // 程序结束时未释放内存
复制代码- void test()
- {
- int* p = (int*)malloc(100);
- if (*p = NULL)
- {
- *p = 20;
- }
- }
- int main()
- {
- test();
- while (1)
- ;
- return 0;
- }
复制代码
野指针的利用
已开释的指针或指向不存在内存的指针被称为野指针,利用野指针大概导致程序瓦解。例如:
- int *ptr = (int*)malloc(10 * sizeof(int));
- free(ptr);
- printf("%d\n", *ptr); // 错误:野指针
复制代码 缓冲区溢出
在访问动态分配的数组时,假如超出数组边界,大概导致缓冲区溢出。例如:
- int *arr = (int*)malloc(5 * sizeof(int));
- for (int i = 0; i < 6; i++) {
- arr[i] = i; // 缓冲区溢出
- }
- free(arr);
复制代码 未检查realloc失败
利用realloc调解内存大小时,假如失败会返回NULL,但原内存块大概仍旧有效。例如:
- int *ptr = (int*)malloc(10 * sizeof(int));
- ptr = (int*)realloc(ptr, 20 * sizeof(int));
- if (ptr == NULL) {
- // 处理失败情况
- }
- free(ptr);
复制代码 总结:
C语言中的动态内存管理涉及复杂的操纵,容易引发多种错误。开发者应严格依照以下原则:
- 在利用前检查指针是否为NULL。
- 确保访问内存时在有效范围内。
- 避免重复开释内存。
- 及时开释不再利用的动态内存。
- 利用工具(如Valgrind)检测潜在题目。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |