我有一个关于整数指针的动态内存分配的查询。
int main()
{
int *a;
*a = 5;
printf("value = %d\n", *a);
return 0;
}
据我了解,以上代码应返回分段错误,该错误发生在我的PC(Ubuntu 32位)中。
但是,在我的MacOS和Fedora Linux系统上执行时,同一段代码的输出为“值= 5”。知道吗,即使我没有为整数指针分配内存,为什么这段代码也可以在这两个系统上运行?
答案 0 :(得分:4)
当系统检测到您使用了错误的内存地址时,发生分段错误。显然,这在您的情况下不会发生。
未初始化的指针可能指向一些允许您读写的内存。写入该地址可能会更改不相关的数据,或者可能会更改程序的机器代码,并可能导致以后崩溃或奇怪的行为。该行为是不确定的,并且在修改程序的不相关部分时可能会更改。
要检查此类问题,可以使用valgrind
之类的工具。
答案 1 :(得分:3)
我认为,只要您必须按照代码段的方式处理内存,便会进入未定义行为的领域。您的指针可能已被随机初始化为有效的内存位置,因此可以使用该提示。如果要测试100%机会失败,则应将a
初始化为NULL
。
答案 2 :(得分:1)
取消引用未初始化的指针时,将调用undefined behavior。这意味着您无法预测程序的反应。它可能会崩溃,可能会输出奇怪的结果,或者它似乎可以正常工作。
这就是为什么它在一个系统上“起作用”但在另一个系统上崩溃的原因。仅仅因为您执行可能导致崩溃的操作,并不意味着它会。