【问题标题】:Which way to reserve memory for a string?哪种方式为字符串保留内存?
【发布时间】:2010-01-04 19:01:07
【问题描述】:

我创建了一个宏来为 C 中的字符串保留内存。它看起来像这样:

#define newString(size) (char*)malloc(sizeof(char) + size)

那么我有什么理由不应该在我自己的个人项目中使用这个宏吗?我知道我不应该在生产代码中这样做,因为它要求每个人都拥有那个头文件并且每个人都知道newString 是一个宏。

【问题讨论】:

    标签: c memory memory-management malloc c-preprocessor


    【解决方案1】:

    (char*)malloc(sizeof(char) * (size+1)) 会更合适(+1 是为了说明字符串末尾的 NULL,如果适用)。

    如果复制一个字符串,strlen() 不考虑终止字符串的 NULL,因此需要额外的内存 char

    【讨论】:

    • 不要使用size+1,而是使用size + sizeof('\0'),这可能更具可读性。
    【解决方案2】:

    我不太确定使用预处理器来节省一些输入是否是个好主意。 (那条路是黑暗而可怕的。)不久之后,您就会想在宏中添加一些东西,并且您将开始遇到难以调试的问题。

    如果您正在滚动自己的内存管理,请使用真正的功能并提供免费的“删除”功能。

    如果您担心性能,您的编译器足够聪明,可以为您内联小函数。

    【讨论】:

      【解决方案3】:

      你应该检查分配是否成功。

      char* ptr = (char*)malloc(sizeof(char) * size); //Not '+' size!!
      if (ptr == 0) //or NULL if defined
      {
          //cannot allocate
      }
      

      但是使用宏没有问题

      【讨论】:

        【解决方案4】:

        主要原因是sizeof(char)被定义为始终为1。所以你应该改写:

        malloc(size)
        

        而且它会比newString(size) 更短。此外,malloc 返回一个 void *,您不需要在 C 中进行转换。

        另一个原因是当你的意思是*时,你不要写+

        【讨论】:

        • 使用 sizeof(char) 没有任何问题。我们都知道它是 1,而且它不太可能改变,但是拥有额外信息并没有任何缺点。他不需要一遍又一遍地输入这个。为此,他正在定义宏。
        • 添加到 @A. Levy 说,char 也比周围有一个神奇的数字更具可读性。
        • 但是sizeof(char) == 1永远改变,并且有一个缺点:它使代码更加冗长和混乱。我会立即怀疑我看到的任何使用sizeof(char) 的代码,这表明作者不太了解 C。
        • 指定 sizeof 的一个原因是,除了 8 位 ASCII 字符之外,您的代码还可能使用 16 位 Unicode 字符。
        • 当然会改变。当您移动到 ​​Unicode 并搜索 + 将“char”替换为“wchar_t”时。
        【解决方案5】:

        你的宏相当于

        malloc(size + 1)
        

        就像在 C 中一样,您不需要强制转换 mallocsizeof(char) 的结果等于 1 的定义。因此,它并不能真正为您节省很多打字时间。即使在您的个人项目中,我也建议不要这样做,因为我认为它没有任何好处。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-06
          • 1970-01-01
          • 1970-01-01
          • 2013-03-11
          • 1970-01-01
          • 2015-01-09
          相关资源
          最近更新 更多