【问题标题】:Why do we need to cast what malloc returns?为什么我们需要强制转换 malloc 返回的内容?
【发布时间】:2010-12-10 16:29:48
【问题描述】:
    int length = strlen(src);
    char *structSpace = malloc(sizeof(String) + length + 1);
    String *string = (String*) structSpace;    
    int *string = (int*) structSpace;

*我创建了一个名为 String 的结构

【问题讨论】:

  • C 和 C++ 是两种不同的语言,这看起来像 C,从问题中删除 C++ 标记将为潜在的回答者澄清它。
  • 那么“字符串”到底是什么?
  • String * 在我看来不像 C,但它显然在更多方面令人困惑。
  • *对不起,我创建了一个名为 String 的结构
  • 你有两个字符串变量...

标签: c malloc heap-memory


【解决方案1】:

你没有。 void* 将隐式转换为您在 C 中需要的任何内容。另请参阅C FAQ,了解为什么要明确避免在 C 中转换 malloc 的返回值。@Sinan 的回答进一步说明了为什么不一致地遵循了这一点。

【讨论】:

  • 正确,你不应该在 C++ 中使用 malloc。
  • 这是典型的反应,但我并不完全同意。当然,如果你有一个无脑编译器,它可能会让你在不包括stdlib.h 的情况下逃脱,但在某些情况下,你可以让编译器检查你的工作。查看我对stackoverflow.com/questions/1322884/…的评论
【解决方案2】:

因为 malloc 返回一个指向 void 的指针,也就是说,它只是分配内存块,而不考虑将存储在那里的数据。在 C++ 中,您返回的 void* 不会被隐式转换为您的类型的指针。在您的示例中,您没有转换 malloc 返回的内容。 Malloc 返回了一个 void*,它被隐式转换为 char*,但在下一行你......好吧,它不再有意义了。

【讨论】:

  • 现在你的代码没有意义了。两个变量叫string?你到底想问什么?
  • 需要明确的是,您不必也不应该真的在 C 编程语言中转换 malloc() 的返回值。这与 C90 之前的一个老问题有关。我认为最初的问题可能被标记为 C++ 而不是 C,其行为与回答者所说的不同。
【解决方案3】:

C 常见问题解答列表是非常宝贵的资源:@​​987654321@。

【讨论】:

    【解决方案4】:

    这是使“C++ 是 C 的超集”这一说法不完全正确的少数问题之一。在 C 中,void 指针可以隐式转换为任何其他类型的指针。但是,C++ 对类型安全性要求更严格一些,因此您需要将malloc 的返回值显式转换为适当的类型。通常,这不是什么大问题,因为 C++ 代码倾向于使用 new 而不是 malloc,这不需要类型转换。

    【讨论】:

      【解决方案5】:

      在 C 中,从 malloc 转换结果是不必要的,也不应该这样做。例如,这样做可以掩盖 #include <stdlib.h> 失败的错误,因此您在范围内没有 malloc 的原型。这反过来又会导致其他错误和缺乏可移植性(尽管在这方面最严重的违规者现在大多已经过时了)。

      在 C++ 中,您必须强制转换 malloc 的结果以将其分配给指向除 void 之外的任何类型的指针。但是,除非您真的需要编写可以编译为 C 或 C++ 的代码,否则您通常应该完全避免在 C++ 中使用 malloc 并使用 new 分配内存。

      【讨论】:

        【解决方案6】:

        您往往会从新手(或 C++ 程序员 :-) 那里看到这种 C 代码:

        int main() {
            int len = 40;
            char *my_string = (char *) malloc(sizeof(char)*len);
            return 0;
        }
        

        这是不必要的和邪恶的,你可以通过包含stdlib.h来避免无用的演员表

        #include <stdlib.h>
        int main() {
            int len = 40;
            char *my_string = malloc(sizeof(char)*len);
            return 0;
        }
        

        【讨论】:

        • 如果你真的想要sizeof,请使用char *my_string = malloc(sizeof(*my_string)*len);,这样即使 LHS 发生变化,RHS 也能保持正确。否则,请注意 sizeof(char) 始终为 1
        • 顺便说一句,如果你不#include ,代码是不正确的,因为没有原型的malloc()返回一个int,指针值可能不能用int表示(未定义行为...)
        【解决方案7】:

        您应该强烈考虑在使用 malloc 命令后进行强制转换,因为它提供了更大的可移植性和与程序其他部分的更大兼容性。如果不这样做,您可能会面临数据类型不兼容的风险,从而导致错误。

        【讨论】:

          猜你喜欢
          • 2013-12-04
          • 2021-03-19
          • 1970-01-01
          • 1970-01-01
          • 2012-09-08
          • 1970-01-01
          相关资源
          最近更新 更多