Chinaunix首页 | 论坛 | 博客
  • 博客访问: 733464
  • 博文数量: 192
  • 博客积分: 2653
  • 博客等级: 少校
  • 技术积分: 1623
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 18:25
个人简介

How tough life is, how strong you should be!

文章分类

全部博文(192)

文章存档

2015年(1)

2014年(2)

2013年(37)

2012年(152)

分类: LINUX

2012-12-18 17:11:50

原文地址:http://blog.csdn.net/ssff1/article/details/5006722

一、malloc()和free()的基本概念以及基本用法: 

1、函数原型及说明: 

void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。 

关于分配失败的原因,应该有多种,比如说空间不足就是一种。 

void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。 

2、函数的用法: 

其实这两个函数用起来倒不是很难,也就是malloc()之后觉得用够了就甩了它把它给free()了,举个简单例子: 

程序代码: 
// Code... 
char *Ptr = NULL; 
Ptr = (char *)malloc(100 * sizeof(char)); 
if (NULL == Ptr) 

exit (1); 

gets(Ptr); 

// code... 
free(Ptr); 
Ptr = NULL; 
// code... 
就是这样!当然,具体情况要具体分析以及具体解决。比如说,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了。 

3、关于函数使用需要注意的一些地方: 

A、申请了内存空间后,必须检查是否分配成功。 

B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。 

C、这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会 

出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。 

D、虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一些编译器的检查。 

栈是由编译器自动分配释放,存放函数的参数值、局部变量的值等。操作方式类似于数据结构中的栈。 

堆一般由程序员分配释放,若不释放,程序结束时可能由OS回收。注意这里说是可能,并非一定。所以我想再强调一次,记得要释放!


#include
char *returnStr()
{
    char *p="hello world!";
    return p;
}
int main()
{
    char *str;
     str=returnStr();
    printf("%s/n", str);
    
    return 0;
}
#include
char *returnStr()
{
    char p[]="hello world!";
    return p;
}
int main()
{
    char *str;
     str=returnStr();
    printf("%s/n", str);
    
    return 0;
}

想问下 这俩个函数中的p是不是都是函数的局部变量?
如果都是局部变量的话,那么他们应该都是“栈”上分配内存的啊。当函数结束的时候,都会被pop出来而销毁的。

 

答:

第1个,p是局部变量,但其指向的内存是全局的。函数返回后,虽然p本身销毁了,但它指向的内存仍存在,故不会有问题

第2个,数组p是局部的,返回后,数组内存被销毁,故有问题。


注意:第1个里面,字符串常量是占用全局内存(跟全局变量一样),其空间是程序加载时就分配了的(虽然在源代码中是出现在函数内部)。
   第2个中,p是函数运行时临时在栈上分配的数组。


动态分配的内存一直存在直到free,而相对应的变量(既使是指向动态分配内存)则根据其定义的位置而作用域不同。

 

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