C和指针之动态内存分配常见问题和总结
2017-12-02 02:19
429 查看
1、动态内存分配常见问题
1) 结构体成员指针未初始化2)为指针分配内存太小
3)内存分配成功,但是没初始化
4)内存越界,内存泄漏,free多次或者释放之后没有设置为NULL
2、测试代码
#include <stdio.h> #include <stdlib.h> #include <string.h> //结构体成员指针需要初始化 struct student { char *name; int score; }stu, *p_stu; int main() { //结构体成员指针未初始化,去掉下面一行代码就会出问题 stu.name = malloc(100); strcpy(stu.name, "chenyu"); stu.score = 99; printf("stu name is %s and score is %d\n", stu.name, stu.score); if (stu.name) { free(stu.name); stu.name = NULL; } char *p = NULL; //用malloc申请0字节内存 p = malloc(0); if (p != NULL) { printf("申请内存成功,但是无法使用\n"); free(p); p = NULL; // free两次会出错 // free(p); } char *p3 = malloc(100); if (p3 != NULL) { strcpy(p3, "chenyu"); printf("p3 address is %p\n", p3); printf("p3 is %s\n", p3); free(p3); //这里没有设置p3 = NULL,程序往下走 } //释放了内存,但是地址依然不会变 printf("p3 address is %p\n", p3); if (NULL != p3) { //free(p3)之后,没有置为NULL,这里依然可以进来 printf("这是时候p3内存释放了,如果还继续使用就会出错\n"); //如果这个时候调用下面的函数就会出错 //strcpy(p3, "chefdsfdsfdsfdsafdsfdsfsfsdfsdafdsfsadnyu"); } //可以free(NULL),没啥效果 free(NULL); free(NULL);
3、运行结果
1111deMacBook-Pro:malloc a1111$ vim error.c 1111deMacBook-Pro:malloc a1111$ gcc -g error.c -o error 1111deMacBook-Pro:malloc a1111$ ./error stu name is chenyu and score is 99 申请内存成功,但是无法使用 p3 address is 0x7fabc3403110 p3 is chenyu p3 address is 0x7fabc3403110 这是时候p3内存释放了,如果还继续使用就会出错
4、总结
1、之前对malloc的参数理解有点模糊,malloc的参数是分配的是连续内存字节,然后用了malloc在堆区分配之后,一定要判断得到的结果是否为NULL进行判断,用完之后一定要记得free(p),然后设置p = NULL,防止内存泄漏,一个malloc对应一个free,malloc可以申请内存0大小内存,但是不能使用,内存分配了要记得初始化,一般用memset2、之前不知calloic和realloc分配内存,它们都是在堆区分配了内存,calloc有个分配多少个大小的参数,以及分配之后把指向的内存指为0,realloc用于修改已经分配好的内存大小,可以
扩大和缩小,用了realloc函数之后,我们应该使用realloc所返回的指针。
3、指针分配的内存太小也会出问题,不能访问动态分配内存之外的区域,free函数不能传递一个非由malloc函数返回的指针(除空指针之外),free两次会出错,然后free之后内存地址依然不>会变化,只是指向的内存释放了,动态内存释放了不能再访问
4、我之前不知道内存0地址就是NULL地址,定制变量和使用完都要设置为NULL,防止这个指针乱指,
5、简单理解内存分为3部分
1)、静态区(全部变量和static变量,静态区的内存在这个程序的生命周期都存在,由编译器在编译的时候分配)、
2)、栈区(保存局部变量,栈上内容之在函数范围存在,函数运行结束会自动销毁,效率高,所以不能再函数内部返回栈区分配的内存)
3)、堆区(由malloc系列函数或者new操作分配的内存,由free释放和delete释放,没释放之前,一直在,使用灵活,空间比较)
相关文章推荐
- C和指针之动态内存分配堆、栈、全局区(静态区)、常量区对比总结学习笔记
- 动态内存分配涉及到的二级指针,传递相关
- [转]内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- 数组、指针和字符串:动态内存分配和释放
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- 指针与内存的动态分配(dynamic allocation)
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- C和指针之动态内存分配malloc、calloc、realloc简单使用和区别
- C和指针之动态内存分配之编程练习4
- c语音动态内存分配,内存重新分配,内存释放,指针运算
- C和指针之动态内存分配之输入很多整数进行排序
- 三十二、数组、指针和字符串:动态内存分配和释放
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- C/C++动态内存分配之用malloc和指针实现动态数组排序
- 关于动态内存分配与字符串操纵的问题总结
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- char ** str的使用方法:动态内存分配-------二维指针
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- 智能指针的模板,用来管理动态分配的内存
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结