我想知道C指针是否可以指向内部块中的值,然后在内部块结束后取消对该指针的引用?

#include <stdio.h>

int main() {
    int a = 42;
    int *r;
    {
        int b = 43;
        r = &b;
    }
    int c = 44;
    printf("%d\n", c);  // Output: 44

    // Is this OK?
    printf("%d\n", *r); // Output: 43
    return 0;
}

我得到的输出"43"是幸运的还是故意的?C语言规范是否说明了这种情况?(请注意,我不是问特定的C编译器的行为)

推荐答案

这是不允许的.你很幸运,你得到了43分的yields .

b中的lifetime在它被声明为结束的作用域之后结束,访问生命周期已结束的变量会触发undefined behavior.

这在C language:

对象的lifetime是程序执行过程中的一部分 保证为其保留该存储空间.物体存在, 具有常量地址,并保留其最后存储的值 在它的一生中.If an object is referred to outside of its lifetime, the behavior is undefined. The value of a pointer becomes indeterminate when the object it points to (or just past) reaches the end of its lifetime.

C++相关问答推荐

获取二维数组的最大元素

为指针 struct 创建宏

C语言中字符数组声明中的标准

如何在Visual Studio代码中关闭此函数名称显示功能?

如何在C中从函数返回指向数组的指针?

C lang:当我try 将3个或更多元素写入数组时,出现总线错误

如何在ASM中访问C struct 成员

C-使用指针返回修改后的整数数组

为什么我可以在GCC的标签后声明变量,但不能声明Clang?

为什么指针运算会产生错误的结果?

有什么方法可以将字符串与我们 Select 的子字符串分开吗?喜欢:SIN(LOG(10))

C程序向服务器发送TCPRST

使用C++中的字符串初始化 struct 时,从‘char*’初始化‘char’使指针变为整数,而不进行强制转换

如何编写postgresql支持函数

将char*数组深度复制到 struct 中?

分支预测和UB(未定义的行为)

C struct 中的冒泡排序

是什么阻止编译器优化手写的 memcmp()?

创建 makefile 来编译位于不同目录中的多个源文件

当循环变量在溢出时未定义时,可以进行哪些优化?