malloc 和 realloc 的使用。

来源:互联网 发布:冢原卜传 知乎 编辑:程序博客网 时间:2024/05/17 03:39

   最近应美国运营商的需求写一个程序,需要从高通log中解析手机语音和数据的注册信息,显示到组件上。 

  解析出的信息要写入一个字符串中。在给字符串分配内存空间时,遇到一些小问题。

1) malloc  函数

      void *malloc(unsigned int num_bytes);

  malloc 函数向内存中申请num_bytes 数量的内存块,并返回一个内存块的首地址。

  比如 以下语句定义了一个字符串, 字符串包含1024个字节, 首地址为a.

      char* a=Null;

      a= (char *) malloc(1024);

2) realloc

   void *realloc(void *mem_address, unsigned int newsize); 

   realloc 的功能是内存的扩展, 一般是用在当申请的旧的内存空间不够使用的时候。 

   它会首先申请一块newsize 大小的内存, 然后将*mem_address 指向的数据拷贝到 新申请的内存空间中,并返回新的内存空间的首地址。

  

我在程序调试的过程中, 遇到的问题是。

首先申请了一块内存存放PDP 信息。

mem_size = 2+ 3*(param->pdn_address.pdn_addr_len-1) + 4;    char* data_msg = (char*)malloc(mem_size);

log :pdn address info data_msg 1;10,218,74,196;

但是当我扩展data_msg, 并向其追加apn 信息的时候, 我发现出现了data_msg 中信息反而被截断的情况。

mem_size+=param->access_point_name.apn_addr_len+1;

data_msg = (char*)realloc(data_msg,mem_size);

....

log :pdn address info and apn data_msg 1;10,218c

追加内存以后, data_msg 显示的信息反而更短了。

看到这种情况, 我开始以为是因为机器内存空间不足, realloc 扩展空间失败,造成的。

但是实际上是因为当扩展内存的时候, mem_size 不够大,当写入apn 的时候,内存空间不够大, 造成内存空间混乱造成的。

此时内存无法从内存中正确读出数据, 所以显示的数据被截断。


也就是说, 如果有你扩展的空间不够, 出现的现象并不是你追加的数据显示不全, 而是在存贮在内存中的数据完全混乱,出现随机的错误。

0 0
原创粉丝点击