#include <iostream>
int main() {
int num = 30;
int *ptr;
*ptr = num;
std::cout << *ptr; // print 30
std::cout << ptr; // memorry address - 0
}
此代码适用于gcc 4.9.2
为什么不发生错误?在未初始化的ptr中存储指定值有什么意义?如何在未初始化的ptr中存储价值?
我猜这是未定义的行为,因为未初始化的ptr包含垃圾,因此他可以指向随机内存,编译器认为这是可以的,直到我做int *ptr = NULL;
?我不能检查这个假设,因为ptr adrress总是0
。
答案 0 :(得分:2)
代码在语法上是正确的,并始终始终具有未定义的行为。
包含指针的未初始化变量没有任何已定义的值,并且为指针变量赋值可能会产生不同的结果,但都没有定义。
4.1节看起来像是候选人(强调我的):
可以转换非功能非数组类型T的左值(3.10) 到一个右值。如果T是不完整类型,则需要一个程序 这种转变是不正确的。如果对象是左值 refer不是T类型的对象,也不是类型的对象 从T派生,或者如果对象未初始化,则为程序 需要这种转换具有未定义的行为。如果T是 非类型,rvalue的类型是cv-nonqualified版本 除此之外,右值的类型是T.
答案 1 :(得分:1)
此代码对于gcc 4.9.2
是合法的
不,不是。
不要误会&#34;不会产生错误&#34;因为&#34;是合法的&#34;。一般情况下,编译器无法诊断无效指针访问,因此他们不会。这是你的工作!
答案 2 :(得分:0)
您的代码行int *ptr
是一个定义,而不是初始化,因此编译器不会为该值分配任何资源(寄存器或内存)。
但是,直接分配给un-init指针指向的内存确实是一个未定义的行为。