具体来说,抛出malloc的结果有什么危险?

具体来说,抛出malloc的结果有什么危险?

现在,在人们开始将其标记为DUP之前,我已经阅读了以下所有内容,但都没有给出我想要的答案:

  1. 常见问题:抛出malloc的返回值有什么问题?

  2. 所以:我应该显式地转换malloc()的返回值吗?

  3. 所以:C中不必要的指针转换

  4. 那么:我投马洛的结果吗?

上述问题的常见问题和许多答案都提到了一个神秘的错误:malloc其返回值可以隐藏;但是,在实践中,它们都没有给出这样一个错误的具体例子。误差,不是警告.

现在给出以下代码:

#include <string.h>#include <stdio.h>// #include <stdlib.h>int main(int argc, char** argv) {

    char * p = /*(char*)*/malloc(10);
    strcpy(p, "hello");
    printf("%s\n", p);

    return 0;}

使用GCC 4.2编译上述代码,附带和不带强制转换,发出相同的警告,程序正确执行,并在两种情况下提供相同的结果。

anon@anon:~/$ gcc -Wextra nostdlib_malloc.c -o nostdlib_malloc
nostdlib_malloc.c: In function ‘main’:nostdlib_malloc.c:7: warning: incompatible implicit declaration of built-in function 
‘malloc’anon@anon:~/$ ./nostdlib_malloc 
hello

因此,任何人是否可以给出编译或运行时错误的特定代码示例,这些错误可能因转换而发生。malloc回报的价值,还是这只是一个城市的传说?

编辑在这个问题上,我遇到了两个很好的书面论点:

  1. 赞成铸造:证书咨询:

    立即将内存分配函数调用的结果转换为指向分配类型的指针。

  2. 反铸造

    (截至2012-02-14的404错误:使用

    互联网档案回传机

    {2016-03-18:“由于robots.txt不能爬行或显示页”)


慕桂英4014372
浏览 485回答 4
4回答

MMMHUHU

你不会得到编译器错误,但是编译器警告..正如你引用的消息来源(特别是第一次),你能,会,可以变幻莫测运行时错误当使用石膏时不包括stdlib.h.所以你这边的错误不是演员,而是忘了包括stdlib.h..编译器可能会假设malloc是一个函数返回int,因此转换void*实际返回的指针malloc到int然后,由于显式转换,指向指针类型。在一些平台上,int指针可能占用不同的字节数,因此类型转换可能导致数据损坏。幸运的是,现代编译器会发出指向实际错误的警告。见gcc输出:它警告您隐式声明(int malloc(int))与内置的malloc..所以gcc似乎知道malloc即使没有stdlib.h.为了防止这一错误,省略强制转换与编写基本相同的推理。if&nbsp;(0&nbsp;==&nbsp;my_var)而不是if&nbsp;(my_var&nbsp;==&nbsp;0)因为后者可能会导致严重的错误,如果一个人会混淆=和==,而第一个则会导致编译错误。我个人更喜欢后一种风格,因为它更好地反映了我的意图,而且我不倾向于做这个错误。返回的值的转换也是相同的。malloc:我更喜欢在编程中显式化,并且我通常会反复检查以包含我使用的所有函数的头文件。

莫回无

假设非原型函数返回。int.所以你选了一个int指向一个指针。如果指针比int在你的平台上,这是非常危险的行为。另外,当然,有些人会考虑警告成错误,即代码应该在没有错误的情况下编译。就我个人而言,我认为你不需要void *另一种指针类型是C中的一个特性,并考虑那些确实被破坏的代码。

慕村9548890

如果在64位模式编译时执行此操作,则返回的指针将被截断为32位。编辑:抱歉太简短了。下面是一个用于讨论的示例代码片段。main() { &nbsp;&nbsp;&nbsp;char&nbsp;*&nbsp;c&nbsp;=&nbsp;(char&nbsp;*)malloc(2)&nbsp;; &nbsp;&nbsp;&nbsp;printf("%p",&nbsp;c)&nbsp;; }假设返回的堆指针大于int中可表示的值,例如0xAB00000000。如果malloc不是返回指针的原型,则返回的int值最初将在具有所有有效位集的某个寄存器中。现在编译器会说,“好的,如何将int转换为指针”。这将是一个符号扩展或零扩展的低阶32位,它已经告诉malloc“返回”,省略原型。由于int是签名的,我认为转换将是符号扩展,在本例中将值转换为零。如果返回值为0xABF0000000,您将得到一个非零指针,在尝试取消引用时也会带来一些乐趣。
打开App,查看更多内容
随时随地看视频慕课网APP