为指针赋值而不赋值

Assigning value to pointer without new

本文关键字:赋值 指针      更新时间:2023-10-16

根据我对C++的基本知识,我假设以下代码会出现运行时错误。因为编译器没有为y指针分配任何空间,所以我应该在为指针分配值之前添加y = new int; y

是我错了还是编译器隐式地为指针分配了空间y?(我使用 Dev-C++ 4.9.9.2 编译了我的代码。

#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{   
    int* x;
    int* y;               
    x = new int;          
    *x = 42;              
    cout << *x << "n";   
    *y = 13;              
    cout << *y << "n";   
}

Section 4.1 指出:

一个左值 (3.10) 的 非函数、非数组类型 T 可以是 转换为右值。如果 T 是 不完整类型,一个程序 需要此转换是 格式不正确。如果对象 左值引用不是类型的对象 T 且不是类型的对象 派生自 T,或者如果对象是 未初始化,一个程序 需要这种转换有 未定义的行为。如果 T 是 非类类型,右值的类型 是 T 的 CV 不合格版本。 否则,右值的类型为 T.

未定义意味着任何事情都可能发生 - 没有保证。

来自维基 让指针更安全

未分配任何地址的指针称为野生指针。任何使用此类未初始化指针的尝试都可能导致意外行为,因为初始值不是有效的地址,或者因为使用它可能会损坏程序的其他部分。结果通常是分段错误、存储冲突或野生分支(如果用作函数指针或分支地址)。

是我错了还是编译器隐式地为 y 指针分配了空间?

它没有,这种分配是未定义的行为。这意味着它可以长时间工作并且不会引起任何问题,但突然可能会使您的应用程序崩溃。变量 y 实际上被分配了一些随机值,*y=13;将 13 分配给某个随机内存地址,该地址可以是某个结构或堆栈的有效内存地址。如果最初将 y 初始化为 nullptr(或 0,NULL)int* y=nullptr;,那么应用程序应该崩溃。