您的位置:首页 > 其它

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大小内存,但是不能使用,内存分配了要记得初始化,一般用memset

2、之前不知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释放,没释放之前,一直在,使用灵活,空间比较)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: