【问题标题】:Printing the arbitrary address of a not initialized pointer to pointer将未初始化的指针的任意地址打印到指针
【发布时间】:2020-11-01 04:56:54
【问题描述】:

我发现,为了打印 not initialized 指针的任意地址,代码是:

#include <stdlib.h>
#include <stdio.h>

int main()
{
int x = 1;
int *pi0;
int *pi = NULL;
int *pi2 = &x;
int *pi3;
int **ppi;

    printf("Indirizzo pi0: \t %p\n", pi0);      // 0x55e43192a080
    printf("Indirizzo pi: \t %p\n", pi);        // (nil)
    printf("Indirizzo x: \t %p\n", &x);         // 0x7ffdb8405f44
    printf("Indirizzo pi2: \t %p\n", pi2);      // 0x7ffdb8405f44
    printf("Indirizzo pi3: \t %p\n", pi3);      // 0x7ffe56ffe6b0
    printf("Indirizzo pi3: \t %p\n", ppi);      // ???
    
    return 0;
}

我的目标是对 not initialized 指向指针的指针执行相同操作,但是,正如您在最后一个 printf 中看到的那样,如果我尝试打印 ppi 的地址,什么也不会发生(没有警告,没有错误,没有输出)。


编辑:代码有效,我在最后一个 printf 中犯了一个错误,因为我写的是 pi3 而不是 ppi。

【问题讨论】:

  • 使用未初始化的变量(包括指针)是UB。通常未初始化的变量会从内存中获取随机垃圾作为值。
  • 我收到0x0 的最后一个。
  • 我得到0x0所有未初始化的指针。
  • 将文字改为"Indirizzo ppi"
  • 但正如@Jorengarenar 所说,使用未初始化的变量会导致未定义的行为。没有理由期望它打印任意值。

标签: c pointers printf


【解决方案1】:

基本上,这里发生的任何事情都取决于您系统的底层实现。您通过访问未初始化变量的值(在本例中为指针,它是一个保存虚拟内存地址的变量)的值来调用未定义的行为。

如果您的系统没有注意到或不在乎,它可能只会打印出编译器用于 ppi 的寄存器的值,这可能是 0x0 (nil) 或者完全是任意值。

未定义的行为并不意味着会有错误消息或程序崩溃或任何事情,它只是意味着C编程语言不保证任何特定的行为,所以无论编译器决定做什么都是完全有效的.如果您想了解更多信息,This 是一本不错的读物

【讨论】:

    猜你喜欢
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    相关资源
    最近更新 更多