C 让一个动态数组具有自动增长的能力

  • 解决办法:使用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()函数清零内存区的操作。

你可能感兴趣的:(C 让一个动态数组具有自动增长的能力)