繁体   English   中英

指针行为的值为 1

[英]Pointer behaviour gives value as 1

需要明确的是,我知道 C 中指向指针概念的指针以及取消引用双、三指针。 我唯一的疑问是在我编写的以下程序中:

#include<stdio.h>
int main(){
    int a;
    int* p;
    a=5;
    p=&a;
    int **q;
    printf("*p=%d\n",*p);
    printf("*q=%d\n",*q);
}

现在我知道了,这个程序很愚蠢,毫无意义,但这不是问题所在。 问题是为什么? 为什么输出是这样的:

*p=5
*q=1

为什么每次运行都是 *q=1? 还要记住,如果我现在声明 ***r; 并添加以下行:

printf("*r=%d\n",*r);

现在输出是:

*p=5
*q=-40821602 //garbage
*r=1

现在,*r=1。 为什么? **** 也一样。 在这种情况下,*q,*r 是垃圾并且 *s=1。 为什么?

评估未初始化的指针是未定义的行为,这就是您所做的。 cppreference声明了以下未定义行为:

未定义的行为

  • 未定义的行为 - 对程序的行为没有限制。 未定义行为的示例包括数组边界之外的内存访问、有符号整数溢出、空指针取消引用、在没有序列点的表达式中多次修改同一标量、通过不同类型的指针访问对象等。不需要诊断未定义的行为(尽管诊断了许多简单的情况),并且编译的程序不需要做任何有意义的事情。

因此,您不能期望从您的程序中得到任何有意义的东西。 它可能会打印 1,但它也可以做任何其他事情。 例如,就我而言,它只是崩溃了。

那么问题“为什么?” 根本不是一个有效的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM