【问题标题】:Address of operator can initlize a pointer but the fill-in value is garbage操作符的地址可以初始化一个指针但填充的值是垃圾
【发布时间】:2018-03-24 14:21:22
【问题描述】:

指向未初始化内存的指针会导致错误。引用此类指针表示无效地址。

int *pi;                                                                                                                                                          
printf("%i\n",*pi);  

以上代码导致使用未初始化变量错误。

error: ‘pi’ is used uninitialized in this function

但是,当首先打印地址时,指针似乎由有效地址初始化但填充了无效数据

int *pi; 
printf("%p\n",&pi); //address printing                                                                                                                                                       
printf("%i\n",*pi); 

打印出来的:

0x7ffeea9313c8 //valid virtual address
-125990072 //invalid data

问题

运算符(&)的地址是否初始化了一个指针?如果不是,请纠正错误的理解。

【问题讨论】:

  • 任何取消引用未初始化指针的尝试都是未定义的行为
  • @AndyG 所以这是由编译器决定的
  • 编译器不需要在第一种情况下发出错误 - 事实上,它可以编译“正常”:godbolt.org/g/XBuK4P

标签: c++ c pointers address-operator


【解决方案1】:

因为你将这个指针的地址传递给一个函数,编译器不再能判断它是否已经在那个函数内部被初始化了。

考虑以下函数:

void init_ptr(int **ptr) { *ptr = some_valid_addr; }

然后你调用:

int *pi; 
init_ptr(&pi);

你知道printf() 不会初始化指针,但编译器没有足够的信息来区分。

【讨论】:

    猜你喜欢
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 2015-04-25
    • 2022-06-14
    • 1970-01-01
    相关资源
    最近更新 更多