为啥可以将整数值分配给未初始化的指针

Posted

技术标签:

【中文标题】为啥可以将整数值分配给未初始化的指针【英文标题】:Why can you assign an integer value to an uninitialized pointer为什么可以将整数值分配给未初始化的指针 【发布时间】:2016-05-01 01:55:36 【问题描述】:

当我这样做时,它会完美地打印出“2”。

int main()

    int *p;
    int x = 2;

    *p = x;

    cout << *p;


但是当我第一次将 *p 初始化为 null 时,程序崩溃了。

int main()

    int *p=0;
    int x = 2;

    *p = x;

     cout << *p;


我想问一下,第一个程序一开始就成功运行了,为什么可以给一个未初始化的指针赋值?

[编辑] 我的问题实际上与我得到的这个过去的考试问题有关。您可以勾选多个答案,而且 (b) 和 (c) 似乎都是正确的。但现在我知道 (c) 是否有效完全是因为运气。

【问题讨论】:

永远不要使用未初始化的指针。而且,在添加对它的引用之前,您不应该取消引用指针变量。否则它可以给你任何结果。 【参考方案1】:

第一个程序受到未定义行为的影响。看起来它有效,但不幸的是,看似理智的行为也是未定义的行为。

如果程序取消引用未初始化的指针,请不要指望它始终正确运行。

【讨论】:

如果你真的不走运的话,未定义的行为也可能会格式化你的硬盘【参考方案2】:

永远不要使用未初始化的指针或取消引用空指针,你所做的是未定义行为,世界上任何事情都可能发生。您的代码实际上可以“合理”地工作和表现,这纯属运气。

至于您的代码为何如此行事,这可能是由于您的编译器、机器和操作系统的行为方式所致。 p 的变量声明只会保留未初始化的内存,其值可以是任何值,您只是“幸运”,因为该值指的是可读写的内存位置。而通过将其显式设置为“0”,它指向您的操作系统可能具有的不可读和不可写的内存位置,并且任何访问它的尝试都会导致您的 CPU 向您的操作系统抱怨,操作系统会通过杀死您的程序来响应。 不要依赖这种行为这只是可能发生的事情,将来可能不会发生,即使在相同的系统配置下也是如此。

【讨论】:

【参考方案3】:

在您的第一个代码中,p 指向一些未定义的内存。幸运的是,它是一个可写的内存区域。这似乎奏效了,但 C++ 标准,我和这里的每个人都向你保证,坏事肯定会发生。

int main()

    int *p;  //it may even point to the first variable on the main() stack, who knows?...
    int x = 2;

    *p = x;

    cout << *p;


第二次立即失败,因为您尝试对地址为0 的数据进行int 加载(读取)操作...坦率地说,其在现实生活中的位置未定义。读取的偏移量可能是内存地址0+4,也可能是内存地址0-4 ...。谁知道呢。

永远不要使用未初始化的指针!

【讨论】:

以上是关于为啥可以将整数值分配给未初始化的指针的主要内容,如果未能解决你的问题,请参考以下文章

结构中的指针分配不工作,为啥值没有改变?

我为存储在指针地址中的值分配了一个变量,那么为啥当初始值改变时它不改变呢?

c++ 指针基础问题 指针已经被初始化为NULL了,为啥还会出错?

将整数值分配给输出行,pentaho

指针 分配空间

c语言中怎么把一维数组初始化为全零啊,不用循环