搜索
查看: 1423|回复: 12
打印 上一主题 下一主题

【重新拾笔】(原创)c动态内存分配篇!

[复制链接]
跳转到指定楼层
楼主
发表于 2014-2-24 19:19:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 超神级 于 2014-2-26 20:26 编辑

本文力求通俗易懂简单明了!欢迎大神拍砖、提出修改意见!!   好吧!正式start:
                    学习动态内存分配的话就必须要提malloc函数了!为什么是malloc函数不是关键字呢!因为malloc的实现真的就是一个函数!有返回类型!有参数!
                 好吧start第一个动态内存分配程序!咱们也土点也是以跨函数使用吧!
                                         
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>//必须添加头文件
  4. int *hanshu(void)
  5.     {
  6.         int*p=(int*)malloc(sizeof(int));
  7.         *p=1234;
  8.         return p;
  9. //int*p用来接收返回的在堆中分配的内存空间地址!
  10. //(int*)表示返回的类型!(sizeof(int))这句话是要分配的内存空间大小如果里面填入(2)就是2个字节大小!

  11.     }
  12. int main()
  13. {
  14.         int a,b,c;
  15.         int*p=hanshu();//此P非彼P因为那个P在函数结束的时候已经被销毁了!
  16.     printf("%d",*p);//输出了1234了吧O(∩_∩)O~!有没有激动的感觉..简单吧!
  17.     //可能有较真的童鞋!说干嘛不定义一个指针那该多么方便啊!
  18.     //(⊙o⊙)嗯!是方便!不过你有没有想过!其实无论是栈的空间还是堆的空间都是有限的!如果你写的程序特别特别大!
  19.     //只使用不释放的话内存迟早是要慢的..              
  20.         system("pause");
  21.     free(p);//用完还给系统就好像借东西要还的一样O(∩_∩)O~!为什么是P因为//p是里面是指向那块内存的地址!*p是指指向那块内存的储存的值&p是把指针自身的地址发送过去!
  22.         return 0;
  23. }
复制代码
好吧!动态内存到此结束!
沙发
 楼主| 发表于 2014-2-24 19:25:05 | 只看该作者
本帖最后由 超神级 于 2014-2-24 19:41 编辑

(int*)是个强制类型转换!假设如果你电脑(double占8个字节)如果是double就是以8个字节!1个储存单元!
板凳
发表于 2014-2-24 19:29:06 | 只看该作者
malloc确实是一个函数,并不是像一个函数啊
它确实是由libc提供的,而不是编译器来处理的
为什么malloc没放在C语言核心部分,Richie大神自己也没说过,肯定和当时计算机架构有关系

下面的例子不自然,C的习惯是谁分配谁就负责回收,你写的函数动态分配了内存,那么这个函数就应该负责把内存回收掉

放地址的是p,而不是*p
(int*)是个强制类型转换,而不是函数返回的类型,malloc返回的类型是void*
而且在C中写(int*)malloc(.....) 也是不推荐的,这样子会让一些错误难以检出

在堆里放数据是为了方便共用

还有人家这算法板块……

点评

这一栏可是BOSS的专栏哈,,,你也来踩一脚哈~~  发表于 2014-2-24 21:05
好吧!我想磊哥一定不会介意的!我没有水....待会再写篇链表算法...!如果说malloc有问题的话!有好多人对于malloc内存分配没有手动释放!是否会造成内存泄露有很大争议啊...  发表于 2014-2-24 19:37
地板
 楼主| 发表于 2014-2-24 19:39:53 | 只看该作者
待会再补篇链表,...如果磊哥感觉咱写的不上档次的话就把帖子移到到       
学习日记/习题讨论 吧!不行就删掉吧!我不介意的..
5#
发表于 2014-2-24 19:43:01 | 只看该作者
超神级 发表于 2014-2-24 19:25
(int*)表示返回的数据类型!假设如果你电脑(double占8个字节)如果是double就是以8个字节!1个储存单元!

double占几个字节和(double*)占几个字节是没有直接关系的
double通常是8字节
(double*)是指针,32位环境下4字节,64位环境下8字节

至于malloc分配的内存什么时候会泄露还能起争议的,不是眼花了就是基础都不懂吧……
6#
 楼主| 发表于 2014-2-24 19:45:37 | 只看该作者
rosynirvana 发表于 2014-2-24 19:29
malloc确实是一个函数,并不是像一个函数啊
它确实是由libc提供的,而不是编译器来处理的
为什么malloc没 ...

好吧!都修改好了!待会写篇链表欢迎去拍砖提下意见...
7#
 楼主| 发表于 2014-2-24 19:55:04 | 只看该作者
rosynirvana 发表于 2014-2-24 19:43
double占几个字节和(double*)占几个字节是没有直接关系的
double通常是8字节
(double*)是指针,32位环 ...

double占几个字节和(double*)占几个字节是没有直接关系的
double通常是8字节
好吧!
(double*)是指针,32位环境下4字节,64位环境下8字节
了解了解..
至于malloc分配的内存什么时候会泄露还能起争议的,不是眼花了就是基础都不懂吧……
好吧!不是分配!我是指的是回收!..
8#
发表于 2014-2-24 20:01:07 | 只看该作者
超神级 发表于 2014-2-24 19:55
double占几个字节和(double*)占几个字节是没有直接关系的
double通常是8字节
好吧!

我知道你说的是回收啊,总要先分配出去,才有回收泄露这些概念吧
其实C下面非常单纯,要么手动free掉,要么主函数返回然后操作系统回收掉,其他都会被泄露
9#
 楼主| 发表于 2014-2-24 20:05:25 | 只看该作者
rosynirvana 发表于 2014-2-24 20:01
我知道你说的是回收啊,总要先分配出去,才有回收泄露这些概念吧
其实C下面非常单纯,要么手动free掉, ...

嗯!好吧!
10#
发表于 2014-7-22 13:45:24 | 只看该作者
在C++里可以用new、delete操作符
11#
 楼主| 发表于 2014-7-22 20:57:18 | 只看该作者
利威尔·阿克曼 发表于 2014-7-22 13:45
在C++里可以用new、delete操作符

是的.只不过C++简化了写法而已.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表