如果在使用malloc后返回了一个NULL指针,而您继续尝试使用该指针,会发生什么?

3

我知道在使用malloc之后,你必须确保返回的指针不是NULL,但如果没有这样做呢?


4
对空指针进行解引用是未定义行为。 - Tony
然后,我问你一个问题,你通过这行代码创建了一个数组:char str[3] = "12"; 然后你读取str [5]的值,会发生什么?在这种情况下,你不应该直接使用str [5]。 - peter__barnes
@peter__barnes 访问数组超出其边界也是未定义行为。 - Tony
1个回答

4
关于使用空指针和 * 运算符的问题,2011 年 C 标准(委员会草案 N1570)在第 6.5.3.2 条第 4 段中表示:“如果将无效值分配给指针,则一元运算符 * 的行为未定义。” 一个脚注说明了 null 指针是一个无效值。
许多人认为使用 null 指针就像尝试使用无效地址访问内存,在常见硬件和操作系统上会导致异常并终止程序。然而,现代编译器及其优化器非常复杂,对您的代码执行各种抽象数学变换。结果是,如果您的代码具有未定义的行为,可能会发生各种令人惊讶的事情。
以其他方式使用 null 指针也可能导致未定义的行为,包括与 -> 运算符、下标运算符、+- 二进制运算符以及关系运算符 (<, <=, >, 和 >=) 一起使用。

1
@DevAllanPer:编译器对代码进行非常复杂的操作。当我还是个孩子的时候,编译器很简单。它们读取你的源代码并写出类似于人类书写的汇编代码。然而,今天,它们会查看你的程序并尝试解决问题:“如何编写一个新的短小快速的程序来完成与这个大程序相同的任务?”然后它们会写出全新的东西。关键在于,如果你的程序中有一些未定义的部分,编译器可以将其更改为任何内容。因此,结果就是编译器正在执行的其他任何操作的副产品。 - Eric Postpischil
1
@DevAllanPer:未定义行为在C标准中被定义为“使用不可移植或错误的程序结构或错误的数据时,对于这个国际标准没有强制要求的行为”。就标准而言,这就是它的全部含义。标准笑话是,它可以合法地让恶魔从你的鼻子里飞出来(当然它物理上做不到,但如果它能做到,它也不会违反标准)。从某种意义上说,未定义行为最糟糕的后果是你的程序会安静地按照你的预期行为运行;这意味着很难找到错误。 - Keith Thompson
@EricPostpischil 那么我们可以说编译器的复杂性会影响其结果吗?换句话说,如果我去一个非常老的机器上并尝试取消引用空指针,与较新的机器相比,它可能会导致不同的结果? - DevReacc
我们有没有可能减少对于这个问题的回答中的词汇和冗长?如此广泛地引用C标准似乎有些过分,也没有明确说明OP可以期望什么。 - Miles
所以第二天早上我到了课堂就问了我的教授这个问题,因为这个问题似乎引起了争议(之前发生争议的答案似乎已经被删除了)。根据我的教授,在我们的情况下(刚开始学习C语言或者参加C语言入门课程),当尝试使用由malloc产生的空指针时,你可能会遇到SEG FAULT。只是想为C语言新手提供一些信息。 :) 尽管之前的用户所说的一切都是正确的。所以不要忽视它! - DevReacc
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接