最近应美国运营商的需求写一个程序,需要从高通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 的时候,内存空间不够大, 造成内存空间混乱造成的。
此时内存无法从内存中正确读出数据, 所以显示的数据被截断。
也就是说, 如果有你扩展的空间不够, 出现的现象并不是你追加的数据显示不全, 而是在存贮在内存中的数据完全混乱,出现随机的错误。