【问题标题】:String handling in ANSI C (Memory Allocation)ANSI C 中的字符串处理(内存分配)
【发布时间】:2012-07-11 18:40:36
【问题描述】:

如何给一个 char* 变量赋值一个字符串,而不必事先分配内存?

例如,如果我有一个函数返回一个 char*(例如文件路径),我会以这种方式调用该函数。

char* path;
path = get_path();

如果我不知道路径的长度是多少,我怎么能期望 char* 的行为?在分配给“路径”之前是否有必要分配路径的大小?

【问题讨论】:

    标签: c string pointers memory-management


    【解决方案1】:

    在这种情况下,get_path() 函数返回一个指向它自己的内存缓冲区的指针。现在的问题是,谁分配了该内存,谁负责释放它?

    【讨论】:

      【解决方案2】:

      get_path 中,您必须将指针返回到已分配的变量。像这样:

      char *get_path()
      {
          char *var = (char*)malloc(sizeof(char)*n);
          setdirectory(var);
          return var;
      }
      

      其中n 是目录的大小。

      但是既然你说你不知道目录的大小,你可以得到它的名字,计算单词,分配另一个内存量(那个时候确切的数量)并释放另一个。这将有助于您使用内存。

      【讨论】:

      • 首先,var 只包含一个字符。其次,返回本地(非static)变量的地址会导致未定义的行为,因为一旦您从get_path() 返回,var 就会不复存在。
      • 更好,谢谢(我清理了你的拼写)。一些注意事项:sizeof (char) 定义为 1,并且强制转换 malloc() 的结果是不必要的并且可以隐藏错误。更简单:char *var = malloc(n);
      【解决方案3】:
      char *path;//path is just a pointer
      

      如果你在 get_path() 中为路径字符串分配内存,你只需让指针(char *path) 指向那个内存。

      【讨论】:

        【解决方案4】:

        在您的代码中:

        char* path;
        path = get_path();
        

        get_path 返回一个指向字符串的指针(或等价的地址)。 (指向字符串的指针是指向其第一个字符的指针)。赋值只是复制该指针值,将其存储在path

        get_path 函数本身必须分配空间来以某种方式保存字符串。

        有几种方法可以做到这一点。有些人让调用者有责任在不再需要空间时释放空间。

        推荐阅读:comp.lang.c FAQ,尤其是第 4 节(指针)、第 6 节(数组和指针)、第 7 节(内存分配)和第 8 节(字符和字符串)。

        【讨论】:

        • 非常感谢!我一定会阅读该文档的。但是,当我执行类似 path = "/home/blah" 之类的操作时会发生什么,如何在没有先前内存分配的情况下分配字符串?
        • @GuillermoGruschka:字符串文字本身已为其分配了内存。有一个 char 的匿名数组存在于程序执行的整个生命周期(静态存储持续时间),其中包含字符 "/home/blah" 加上一个终止空字符 '\0'
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-20
        • 1970-01-01
        • 1970-01-01
        • 2013-09-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多