为什么malloc的工作量为零?

时间:2015-10-26 13:10:22

标签: c pointers memory malloc

这是我的代码

malloc(0)

有人可以向我解释为什么我通过终端输入的每个字都会打印给用户?我有scanf。当我尝试segmentation fault给我一个p = malloc(sizeof(char) * 2)

时,不应该这样做

修改

为什么这会给我一个编译错误:

(void*)

当我试图避免error: cannot initialize a variable of type 'char *' with an rvalue of type 'void *'

UNION

3 个答案:

答案 0 :(得分:4)

malloc的C标准明确指明了这一点:

  

如果请求的空间大小为0,则行为为   implementation-defined:返回的值应为null   指针或唯一指针。

来自malloc的返回值:

  

如果size为0,则可以是空指针或唯一指针   成功传递给free()将被返回。否则,它应该   返回一个空指针并设置errno以指示错误。

关于从scanf调用的分段错误,这纯粹是基于环境的实现和运行时行为,只是运气而不是任何东西,下次运行时,它可能因分段错误而崩溃。

答案 1 :(得分:3)

C标准9899:2011 7.22.3规定:

  

如果无法分配空间,则返回空指针。如果大小   请求的空间为零,行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,但返回的指针不应用于访问对象。

意味着从malloc返回的内容是实现定义的行为。您必须阅读特定的编译器文档以查看它在您的情况下的作用:返回空指针或指向0字节数据的非零指针(可能是随机垃圾位置)。

在任何一种情况下,返回的指针都没有指向有效的内存位置。因此,如果您尝试写入它,您将调用未定义的行为。意味着任何事情都可能发生:程序可能崩溃&燃烧,或者看起来可以正常工作并在一个月后崩溃,或其他任何事情。

  

为什么这会给我一个编译错误:<controls:FlyoutsControl> <controls:FlyoutsControl> <controls:Flyout x:Name="yourMahAppFlyout" Header="Flyout" Position="Right" Width="200" IsOpen="{Binding OpenFlyOut, Mode=TwoWay}"> <TextBlock Text="Some text" /> </controls:Flyout> </controls:FlyoutsControl> </controls:FlyoutsControl>

因为您正在尝试使用C ++编译器编译C代码。不要这样做。有些C ++编译器有一个选项可以设置为使用C编译器进行编译。

关于C标准不一致的附注:

标准附件J实际上将上述列为未指明的行为。我怀疑这必须是附件J中的错误,因为上面引用的规范性文本明确指出这是实施定义的。 7.22.3是规范性的,附件J是资料性的,所以我会忽略附件J.

答案 2 :(得分:2)

来自opengroup -

  

如果请求的空间大小为0,则行为是实现定义的:返回的值应为空指针或唯一指针。

malloc(0)没有分配任何内容。因此,当您尝试使用scanf获取输入时,您将调用未定义的行为

  

当我尝试scanf给我一个分段错误时,我不应该这样做吗?

不,当您拥有 UB 时,没有必要。也许你没有那么幸运得到分段错误并获得所需的输出(可能会混淆)。