这是我的代码
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
答案 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 时,没有必要。也许你没有那么幸运得到分段错误并获得所需的输出(可能会混淆)。