为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
慕桂英4014372 2019-06-03 16:11:09
具体来说,抛出malloc的结果有什么危险?现在,在人们开始将其标记为DUP之前,我已经阅读了以下所有内容,但都没有给出我想要的答案:常见问题:抛出malloc的返回值有什么问题?所以:我应该显式地转换malloc()的返回值吗?所以:C中不必要的指针转换那么:我投马洛的结果吗?上述问题的常见问题和许多答案都提到了一个神秘的错误: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回报的价值,还是这只是一个城市的传说?编辑在这个问题上,我遇到了两个很好的书面论点:赞成铸造:证书咨询:立即将内存分配函数调用的结果转换为指向分配类型的指针。反铸造(截至2012-02-14的404错误:使用互联网档案回传机{2016-03-18:“由于robots.txt不能爬行或显示页”)
查看完整描述

4 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

你不会得到编译器错误,但是编译器警告..正如你引用的消息来源(特别是第一次),你能,会,可以变幻莫测运行时错误当使用石膏时不包括stdlib.h.

所以你这边的错误不是演员,而是忘了包括stdlib.h..编译器可能会假设malloc是一个函数返回int,因此转换void*实际返回的指针mallocint然后,由于显式转换,指向指针类型。在一些平台上,int指针可能占用不同的字节数,因此类型转换可能导致数据损坏。

幸运的是,现代编译器会发出指向实际错误的警告。见gcc输出:它警告您隐式声明(int malloc(int))与内置的malloc..所以gcc似乎知道malloc即使没有stdlib.h.

为了防止这一错误,省略强制转换与编写基本相同的推理。

if (0 == my_var)

而不是

if (my_var == 0)

因为后者可能会导致严重的错误,如果一个人会混淆===,而第一个则会导致编译错误。我个人更喜欢后一种风格,因为它更好地反映了我的意图,而且我不倾向于做这个错误。

返回的值的转换也是相同的。malloc:我更喜欢在编程中显式化,并且我通常会反复检查以包含我使用的所有函数的头文件。


查看完整回答
反对 回复 2019-06-03
?
莫回无

TA贡献1865条经验 获得超7个赞

假设非原型函数返回。int.

所以你选了一个int指向一个指针。如果指针比int在你的平台上,这是非常危险的行为。

另外,当然,有些人会考虑警告错误,即代码应该在没有错误的情况下编译。

就我个人而言,我认为你不需要void *另一种指针类型是C中的一个特性,并考虑那些确实被破坏的代码。


查看完整回答
反对 回复 2019-06-03
?
慕村9548890

TA贡献1884条经验 获得超4个赞

如果在64位模式编译时执行此操作,则返回的指针将被截断为32位。

编辑:抱歉太简短了。下面是一个用于讨论的示例代码片段。

main()
{
   char * c = (char *)malloc(2) ;
   printf("%p", c) ;
}

假设返回的堆指针大于int中可表示的值,例如0xAB00000000。

如果malloc不是返回指针的原型,则返回的int值最初将在具有所有有效位集的某个寄存器中。现在编译器会说,“好的,如何将int转换为指针”。这将是一个符号扩展或零扩展的低阶32位,它已经告诉malloc“返回”,省略原型。由于int是签名的,我认为转换将是符号扩展,在本例中将值转换为零。如果返回值为0xABF0000000,您将得到一个非零指针,在尝试取消引用时也会带来一些乐趣。


查看完整回答
反对 回复 2019-06-03
  • 4 回答
  • 0 关注
  • 484 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信