【问题标题】:How to add a dynamically allocated string to array of strings in C?如何将动态分配的字符串添加到C中的字符串数组?
【发布时间】:2015-04-14 11:50:23
【问题描述】:

我必须编写一个将给定字符串添加到字符串数组的函数。

char **add_string(char **array, const char *string)
{
array = realloc(array, (sizeof(string)) * sizeof(char *));
int i = 0;
while (array[i] != NULL){        
    i++;
}
array[i] = malloc((strlen(string) + 1));
strcpy(array[i], string);   
array[i + 1] = NULL;
return array;
}

根据 Valgrid,目前我得到内存泄漏。我没有正确使用 malloc,但我不知道如何修复它。非常感谢您的帮助。

【问题讨论】:

  • 在指针上使用sizeof 可以得到指针的大小,而不是指针指向的内容,所以你在realloc 调用中所做的实际上是sizeof(char *) * sizeof(char *),这可能不是你想要什么。
  • 一般来说,您只想在空间不足时使用realloc,而不是作为在每次迭代中创建1-more的工具。在分配方案中,您通常从一些足以满足您需要的指针开始。 (例如32, 64, 128, 256, ...)即使使用256 pointers,也只需要很小的2k 内存。在代码顶部创建一个方便的#define MAXS 256。您分配您的char **array = calloc (MAXS, sizeof *array); 然后分配每个array[i](或仅分配strdup)。当(i == MAXS),你reallocMAXS * 2 * sizeof *array

标签: c arrays string malloc valgrind


【解决方案1】:

realloc 根据第二个参数分配一个新的大小,但您并没有增加大小,所以基本上每次调用函数时它都会分配相同的大小,而不是增加分配的区域。

您需要将数组中的当前字符串数传递给 add_string,然后在 add_string 中递增它

char** add_string(char** array, int* size, const char* string)
{
   char* newArray = realloc(array, (*size + 1) *sizeof(char*) );
   newArray[*size] = malloc(strlen(string)+1);
   strcpy(newArray[*size], string);
   *size += 1;

...
}

您还应该通过检查返回值来检查 realloc 是否成功。

通常,上述方法不是处理增加的大小的非常有效的方法,因为您每次都调用 realloc 并且这很耗时。相反,您应该以块的形式分配,然后跟踪您已用完多少块,当块用完时重新分配一个新的。

【讨论】:

    【解决方案2】:

    您对array 的重新分配已损坏,它需要搜索以找出数组的长度,假设它总是“紧密”分配的(最后分配的元素是唯一的NULL) .

    【讨论】:

      【解决方案3】:
      char **add_string(char **array, const char *string){
          int i = 0;
          while (array[i] != NULL){        
              i++;//First, count the elements and find NULL element
          }
          array[i] = malloc(strlen(string) + 1);//or strdup(string);
          strcpy(array[i], string);
          char **temp;
          temp = realloc(array, (i+1+1) * sizeof(char *));
          if(temp == NULL){
              perror("realloc at add_string");
          } else {
              array = temp;
              array[i + 1] = NULL;
          }
          return array;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-03-09
        • 2021-12-30
        • 2011-10-21
        • 2013-03-09
        • 2023-01-19
        • 1970-01-01
        • 1970-01-01
        • 2015-03-09
        • 1970-01-01
        相关资源
        最近更新 更多