c - 这段代码有什么问题,它打印将整数转换为整数指针后获得的地址处的值

标签 c pointers termination

#include<stdio.h>

int main()
{
    int a = 10;
    int* p = &a;
    int** q = &p;
    printf("\n%d %d %d", a, *p, **q);

    int y = (int*)2000;
    printf("%d", y);

    /*
    printf("\n%d %d %d %d", a, *p, **q, *((int*)2000)); //Error line.
    */

    return 0;
}

该代码编译并运行。但是,如果取消注释代码,代码仍然会编译,但会在打印最后一个 printf 的结果之前终止。命令。

我的两个问题是:

  1. 如果*((int*)2000)是一个完全有效的代码,例如 (int*)2000 (即,将整数转换为地址/指针以获取该地址处的值),为什么程序在结束之前停止 if *((int*)2000)在场吗?
  2. 为什么此代码不打印 a 的值, *p ,和**q在终止程序之前(它们在尝试打印 *((int*)2000)) 之前被打印)?

最佳答案

  1. *((int*)2000) 不是“完全有效的代码”。将整数转换为指针的结果是实现定义的。在您的实现中,(int*)2000 可能会导致无效的指针。尝试取消引用无效指针会产生未定义的行为,这意味着任何事情都可能发生。当您在取消注释的 printf 行的情况下运行程序时,它恰好导致了分段冲突,因为生成的指针指向无法访问的内存。如果您使用了其他整数,它可能会产生有效的指针,然后您会看到该内存位置的内容。

  2. 在调用函数之前,必须评估函数调用的所有参数。上述错误是在计算 printf() 的参数时发生的,因此程序在调用函数之前停止。结果,没有打印任何内容。

关于c - 这段代码有什么问题,它打印将整数转换为整数指针后获得的地址处的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51993122/

相关文章:

list - 如何解决这个列表反转问题?

coq - 定义产品类型的递归函数

c - 需要帮助为 C 中的内存匹配游戏生成随机字符

C:如何舍入一个全局变量?

C,将带有 GhashTable 键的结构体传递给函数

C - 如何将多个值分配给 HashMap 中的同一个键?

C 字符串函数参数在返回时为 NULL

c - 内存大小加载和存储惩罚分析?

c++ - 需要知道如何检查输入的字符串是否已在 C++ 中的线程安全记录器内终止

c - 共享库和 rpath