- 解决办法:使用realloc()库函数,可以对一个现有的内存块大小进行重新分配(通常是使之扩大),同时不会丢失原先的内容。当需要在动态表(数组)中增加一个数据时,可以进行如下操作:
1、对表进行检查,看看是否已满。
2、如果真的满了,使用realloc()函数扩展表的长度。并进行检查,确保realloc()操作成功进行。
3、然后再在表中增加数据。
代码实现:
int current_element = 0;
int total_element = 128;
char *dynamic_arr = (char *)malloc(total_element);
void add_element(char c)
{
if(current_element == total_element-1)
{
char *p_temp = NULL; //很关键
total_element*=2; //给内存扩容,一般都是直接扩大为2倍
p_temp = (char *)realloc(dynamic_arr, total_element);
if(p_temp == NULL)
{
printf("扩展表内存失败!");
return;
}
dynamic_arr = p_temp;
}
current_element++;
dynamic_arr[current_element] = c;
}
很关键的一点:设置临时指针p_temp
如果不设置临时指针p_temp作为过渡,而是直接dynamic_arr = (char *)realloc(dynamic_arr, total_element);
,很容易在realloc()函数失败时返回NULL而使得指针dynamic_arr被赋值NULL,导致原先的数组失去指针而无法访问,造成内存泄漏。出大问题
- 还有一个calloc()函数,与malloc()函数很相似,只不过会多一个重要步骤:从堆中申请到内存后,会先全部初始化为0或空指针或其他表示初值的数据。而malloc()函数从堆中申请到内存后不会主动清零,一般为了清除脏数据的影响,可以在后面跟一条memset()函数清零内存区的操作。