【发布时间】:2009-07-11 14:28:22
【问题描述】:
以下代码:
int *a;
*a = 5;
很可能会导致分段错误,我知道原因。
以下代码:
int a;
*a = 5;
甚至不会编译。 (gcc 说:一元 * 的类型参数无效)。
现在,指针只是一个整数,用于 用于存储地址。 那么,如果我说,为什么会有问题:
*a = 5;
理想情况下,这也应该导致分段错误。
【问题讨论】:
-
指针是无符号序数标量,不一定是整数。
-
值得注意的是,为了一致性/清晰起见,预期分段错误并不是考虑此类情况下行为的一种过于准确的方法。取消引用任意内存地址在 C 中是未定义的行为。在许多情况下,它会产生分段错误,但这不是必需的。它可能会引发总线错误(Mac OS X 喜欢这样做)。如果它恰好是有效的,它可能会给你该地址的内容。
-
虽然
C难以检测未正确初始化的指针,但它没有检测到int数据类型取消引用。它会在编译时阻止你。但是,您可以使用*(unsigned int *)a = 5强制它,并且可能会得到您期望的分段错误。我说“可能”是因为a的值很可能会转换为程序上下文中的可寻址位置——你会错过你的错误,但会遇到随机寻址的细微错误。 -
如果你把指针算作整数,那么一切都只是整数。毕竟,二进制数字计算机只存储 1 和 0。在 C 编程语言的抽象级别,指针存储的是内存地址,而不是整数。