分配内存的问题
发布日期:2021-06-29 04:56:26 浏览次数:2 分类:技术文章

本文共 1641 字,大约阅读时间需要 5 分钟。

一、使用内存分配应该注意的问题

检查内存是否分配成功,内存声明周期程序结束时要释放,避免导致内存泄露。使用过程中避免指针越界访问。

创建内存分配函数例子:(malloc是分配多少个字节的内存,里面是数字,且malloc分配的是堆上的内存,不是栈里面)

二、分配内存实例

void GetMemory(char*p)

{

p = (char*)malloc(100);

}

void Test(void)

{

char *str = NULL;

GetMemory(str);

strcpy(str,"hello world");

printf(str);

}

malloc()分配了新的内存给p(也就是说p里面存储的或指向的是在堆里面的内存),但是你原来函数中的p是复制了str的值(str传递进去的是指针指向的地址,为NULL,不是存储str的地址。所以你可以改变的是str里面存储的地址指向内存的值)进行操作。函数执行完之后p就找不到了(因为存储p的地址是在栈上临时分配的内存),你的str并没有得到p的值,同时你把p丢了,也没有办法回收分配给p的内存。

故Test函数中的 str一直都是NULL,它并没有指向任何内存,strcpy(str, "helloworld")也不会执行成功,将使程序崩溃。

有两种办法可以改变这种情况:

第一种:传递给形参的是指针的地址。

如果改成指针变量的地址传入即二级指针则不一样。因为传递进去的是指针变量的地址,这样就可以修改指针变量地址存储的地址,即分配了内存给指针变量去指向的地址。

void GetMemory(char **p)

{

p = (char*)malloc(100);

}

void Test(void)

{

char *str = NULL;

GetMemory(&str);

strcpy(str,"hello world");

printf(str);

}

第二种办法就是返回值是内存的地址,也就是返回指针变量。

这种办法在链表中常常用到。如下所示,返回在堆里面的分配的地址,然后将地址赋值给指针变量。

char* GetMemory(char*p)

{

     p = (char*)malloc(100);

     return p;

}

void Test(void)

{

char *str = NULL;

str=GetMemory(str);

strcpy(str,"hello world");

printf(str);

}

三、类似于fun1(char c);fun2(char *c);

main()

{

    char a='a';

    char *p=&a;

    fun1(a);传递进去的是c里面存储的值'a';

    fun2(p);传递进去的是c的地址;

}

1、如果我们在fun1里面改变c的值,在main里面a的值是不会改变的,依然是'a';

同理,我们在fun2里面改变指针(地址变量)c的值,不能改变在main里面p的值,依然是a的地址。

2、这是因为实参传递给形参的是值传递,就是将实参内存里面存储的值拷贝给形参,而不是将内存地址传递给形参;

同理,函数fun里面,会在栈里面给形参分配内存,而内存里面存储的就是实参拷贝的值。

3、所以,我们可以在fun2里面可以改变c存储的地址(&a)所存储的值a('a');

同理,如果我们在fun2里面,改变c原来所存储a的地址,也就是c里面存储是堆的地址(c=(char*)malloc(sizeof(char))),跟p没有关系。

在main里面p的值,依然是a的地址。

4、在函数里面分配的临时内存,在退出函数后会销毁。这时候c里面存储是堆的地址(c=(char*)malloc(sizeof(char)))也就

没有了,那这块在堆里面分配的内存也就找不到了,而堆不会销毁,只有等程序退出才会释放内存。

5、如果要改变p所存储a的地址,要传递的是p的地址给函数fun。

转载地址:https://blog.csdn.net/zhang_yin_liang/article/details/52015649 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:基本知识点
下一篇:C语言的输入输出-几个函数的使用比较

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月07日 14时43分29秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

paip.cpu占用高解决方案---ThreadMast 跟Process Lasso的使用 2019-04-29
paip.提升性能--- mysql 建立索引 删除索引 很慢的解决. 2019-04-29
paip.输入法编程---智能动态上屏码儿长调整--.txt 2019-04-29
Atitit sumdoc t0 final index D:\BaiduNetdiskDownload\sumdoc t0 final\sumdoc t0 wps cld bek D:\Baid 2019-04-29
Atitit sumdoc t0 final index D:\BaiduNetdiskDownload\sumdoc t0 final\sumdoc t0 wps cld bek D:\Baid 2019-04-29
Atitit sumdoc t0 final index 2019-04-29
atitit 编程语言选型知识点体系.docx 编程语言选型时,你需要考虑的几个方面 目录 1. 1.2. 类型系统 5 1 2. 1.5. 语言规范 25 1 3. 1.6. 编程范式 52 2019-04-29
Atitit 编程语言语言规范总结 目录 1. 语言规范 3 2. Types 3 2.1.1. Primitive types 3 2.1.2. Compound types 4 3. State 2019-04-29
Atitit QL查询语言总结 目录 1. QL = Query Language, 是查询语言的简称 1 2. 具体实现 1 2.1. Apcl 流程控制语言 1 2.2. 脚本流程控制 2 2. 2019-04-29
Atitit 开发效率大法 v0 t025.docx Atitit 提升开发效率几大策略 目录 1. 提升效率三原则 3 1.1. 更少的代码量简化 3 1.2. 优化配置减少等待 3 1.3. 2019-04-29
Atitit mybatis的扩展使用sql udf,js java等语言 目录 1.1. 默认,mybatis使用xml,sql等语言来书写业务流程 1 2. 使用ognl调用java函数 1 3 2019-04-29
Atitit if else 选择决策流程ast对比 sql java 表达式类型 binaryExpression hase left and rit expr 目录 1.1. Sql 1 2019-04-29
Atitit 数据库存储引擎 目录 1.1. BLACKHOLE 黑洞引擎 1 1.2. Myisam innodb 1 1.3. Archive 档案类 1 1.4. Fed 连接引擎 2 1. 2019-04-29
Atitit sql注入的防范 目录 1.1. 检查数据类型 1 2. 有限操作DML 1 2.1. 限制执行函数黑名单机制 2 2.2. 限制执行系统sp 2 2.3. 限制数据查询语句类型,只能 2019-04-29
Atitit 自然语言与人工语言的语法构建ast的异同点 目录 1. 语言节点gaishu。。 2 1.1. 节点、函数数量大约200个 2 1.2. 关键词节点 是 有 的 3 1.3. 标识符 2019-04-29
Atitit 效率提升法细则 v3 t028.docx Atitit 提升效率细则 目录 1. 目标 2 1.1. 配置化增加扩展性 尽可能消除编译 方便增加 调整业务逻辑 2 1.2. 统一接口 2019-04-29
Atitit 工程师程序员技术级别对应表与主要特征 P1--p6 说明 类别 职称 对应技术标志 P5 高级工程师 工程师类 一般四五年 P6 资深开发 工程师类 78年经历 P7 P7 2019-04-29
paip.activex控件在WEB中使用流程与工具 2019-04-29
paip.软件及网站项目开发效率低下的思索与改进 2019-04-29
Atitit 可移植性之道attilax著 2019-04-29