【问题标题】:C: realloc an array of stringC:重新分配一个字符串数组
【发布时间】:2012-04-30 09:35:19
【问题描述】:

我想用一个函数重新分配一个字符串数组。我在这里编写了一个非常简单的程序来演示。我希望输出字母“b”,但我得到 NULL。

void gain_memory(char ***ptr) {
    *ptr = (char **) realloc(*ptr, sizeof(char*) * 2);
    *ptr[1] = "b\0";
}

int main()
{
    char **ptr = malloc(sizeof(char*));
    gain_memory(&ptr);
    printf("%s", ptr[1]); // get NULL instead of "b"
    return 0;
}

非常感谢!

【问题讨论】:

  • 不要投realloc的返回,这毕竟是C。 (这样做可能会隐藏编译器会告诉您的问题。)
  • 另外,不要将realloc 的结果立即分配给您要重新分配的指针。如果realloc 失败,则您丢失了原始指针并泄漏了内存。 (哦,还要检查分配失败。)

标签: c arrays string realloc


【解决方案1】:

[] 运算符的优先级比 * 高,因此像这样更改代码将正常工作。

(*ptr)[1] = "b";

附: "\0" 是不必要的。

【讨论】:

    【解决方案2】:

    您应该在 gain_memory 中的 *ptr 周围加上括号:

    (*ptr)[1] = "b\0";
    

    【讨论】:

      【解决方案3】:

      您没有为字符串数组中的实际字符串分配任何内存,您需要执行以下操作:

      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      
      void gain_memory(char ***ptr, int elem) {
          *ptr = (char**)realloc(*ptr, 2*elem*sizeof(char*));
          (*ptr)[1] = "b";
      }
      
      int main()
      {
          //How many strings in your array?
          //Lets say we want 10 strings
          int elem = 10;
          char **ptr = malloc(sizeof(char*) * elem);
          //Now we allocate memory for each string
          for(int i = 0; i < elem; i++)
              //Lets say we allocate 255 characters for each string
              //plus one for the final '\0'
              ptr[i] = malloc(sizeof(char) * 256);
      
          //Now we grow the array
          gain_memory(&ptr, elem);
          printf("%s", ptr[1]);
          return 0;
      }
      

      【讨论】:

      • 他不需要为示例中的实际字符串分配内存,因为他只为其中一个指针分配了一个常量字符串。
      猜你喜欢
      • 2016-07-31
      • 2012-11-10
      • 2022-01-01
      • 2011-03-12
      • 2020-08-07
      • 1970-01-01
      • 2017-08-03
      • 2019-10-13
      相关资源
      最近更新 更多