为未初始化的ptr分配值

时间:2015-04-20 17:04:35

标签: c++ pointers gcc

#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

3 个答案:

答案 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指针指向的内存确实是一个未定义的行为。