Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6478961
  • 博文数量: 579
  • 博客积分: 1548
  • 博客等级: 上尉
  • 技术积分: 16635
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-12 15:29
个人简介

http://www.csdn.net/ http://www.arm.com/zh/ https://www.kernel.org/ http://www.linuxpk.com/ http://www.51develop.net/ http://linux.chinaitlab.com/ http://www.embeddedlinux.org.cn http://bbs.pediy.com/

文章分类

全部博文(579)

文章存档

2018年(18)

2015年(91)

2014年(159)

2013年(231)

2012年(80)

分类: C/C++

2014-05-14 10:08:41

操作系统:ubuntu10.04

前言:
    在开发中,很多时候需要动态分配内存,这就需要使用到c标准库中的各个内存分配函数了。下面来讲解一下这些函数的使用方法,相互间的异同。

一,alloc
    头文件:#include
    函数定义:void *alloca(size_t size);
    函数说明:alloca() 用来配置 size 个字节的内存空间,然而和 malloc、colloc 不同的是,
                    alloca() 是从 栈空间(stack) 中分配内存的,因此在函数返回时会自动释放此空间。
    返回值:内存分配成功则返回首地址,失败则返回 NULL
    

二,calloc
    头文件:#include
    函数定义:void *calloc(size_t num, size_t size);
    函数说明:calloc() 用来分配 num 个相邻的内存单位,每个内存单位的大小为size,并返回指向
                    第一个单位的首地址的指针。这个和使用下列的方式效果相同:malloc(num * size);
                    不过,在使用 calloc() 分配的内存时,会将内存内容初始化为0.
    返回值:内存分配成功则返回第一个单位的首地址,失败则返回 NULL。


三,malloc
    头文件:#include
    函数定义:void *malloc(size_t size);
    函数说明:malloc() 用来从堆中(heap)分配内存空间,其大小为 size。
    返回值:分配成功则返回首地址,失败则返回 NULL。


四,realloc
    头文件:#include
    函数定义:void *realloc(void *ptr, size_t size);
    函数说明:参数 ptr 为指向先前由 malloc、calloc、realloc 所返回的内存指针,而参数 size 为
                    新分配的内存大小,其值可比原内存大或小。若 size 值比原分配的内存空间小,内
                    存内容不会改变,且返回的指针为原来内存的首地址(即ptr);若 size 值比原分配
                    的内存空间大,则 realloc 不一定会返回原来的指针,原先的内容不会改变,但新多
                    出的内存则为设初始值。如果 ptr 为 NULL,则相当于 malloc(size);如果 size 为 0,
                    则相当于 free(ptr)。
    返回值:内存分配成功则返回首地址,失败则返回 NULL。


五,实例

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>


  3. int global_init_var = 84; //已初始化的全局变量
  4. int global_uninit_var; //未初始化的全局变量
  5. char *str1 = "hello world!"; //字符串常量

  6. void func1(int i)
  7. {
  8.     printf("%d\n", i);
  9. }

  10. int main(void)
  11. {
  12.     static int static_var = 85; //已初始化的静态局部变量
  13.     static int static_var2; //未初始化的静态局部变量
  14.     char *str2 = "22222"; //字符串常量

  15.     int a = 1;
  16.     int b;

  17.     char *ptr_stack = NULL;
  18.     char *ptr_heap    = NULL;

  19.     ptr_stack = alloca(100);
  20.     printf("ptr_stack : %p\n",ptr_stack);
  21.     printf("a : %p\n",&a);
  22.     printf("b : %p\n",&b);

  23.     ptr_heap = malloc(100);
  24.     printf("ptr_heap : %p\n",ptr_heap);
  25.     free(ptr_heap);

  26.     printf("static_var : %p\n",&static_var);    
  27.     printf("global_init_var : %p\n",&global_init_var);    
  28.     printf("global_uninit_var : %p\n",&global_uninit_var);
  29.     printf("static_var2 : %p\n",&static_var2);
  30.     printf("str2 : %p\n",str2);
  31.     printf("str1 : %p\n",str1);
  32.     
  33.     
  34.     func1(static_var+static_var2+a+b);

  35.     return a;

    运行结果:
    


六,参考文件
1,《Linux C函数库参考手册》



阅读(9682) | 评论(4) | 转发(5) |
给主人留下些什么吧!~~

andyhzw2014-05-15 15:21:19

dididimeme01:网上查了一下,给出的答案是, “注意:这里原始内存中的数据还是保持不变的。当内存不再使用时,应使用free()函数将内存块释放。",但是这样就带来另一个问题,当返回地址与输入地址相同时,有被free两次的风险,如果释放还需要判别是否地址相同。

只需释放一次。
ptr = malloc;
;;;
ptr = realloc;
...
free(ptr);

回复 | 举报

andyhzw2014-05-15 15:17:51

dididimeme01:有个疑问关于realloc,即如果分配成功而返回的指针与输入指针的地址不同(分配成功),那原先输入的地址是否还有效?

无效,数据会被复制到新的内存中。

回复 | 举报

dididimeme012014-05-15 14:55:39

网上查了一下,给出的答案是, “注意:这里原始内存中的数据还是保持不变的。当内存不再使用时,应使用free()函数将内存块释放。",但是这样就带来另一个问题,当返回地址与输入地址相同时,有被free两次的风险,如果释放还需要判别是否地址相同。

dididimeme012014-05-15 14:53:09

有个疑问关于realloc,即如果分配成功而返回的指针与输入指针的地址不同(分配成功),那原先输入的地址是否还有效?