为指针赋值而不赋值
Assigning value to pointer without new
根据我对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;
,那么应用程序应该崩溃。
相关文章:
- 全局作用域中函数指针的赋值
- 错误:在为指针赋值时,void值没有被忽略
- 关于 c++ 函数中指针赋值的简单问题
- VkSurfaceKHR 指针的值在函数调用后更改,无需任何显式赋值
- 在 Arduino 中为 2D 指针数组赋值
- 链表指针赋值为什么我们不能直接将尾巴分配给 temp 而不是尾巴>尾巴下一个
- 为什么通过指针赋值常量没有效果?
- 通过 lambda 在空指针处赋值
- 指针到指针算术:赋值
- 复制构造函数中的指针赋值
- 如何将值从指针永久赋值到变量
- 通过智能指针向类成员进行赋值
- 为什么在取消引用的指向接口的指针上使用赋值运算符不是编译器错误
- 将函数赋值给函数指针,常量参数正确性
- 为指针指向的地址赋值?C++
- C++ 包含唯一指针成员变量的类的赋值运算符
- 在类数据成员中赋值指针
- 有没有一种方法可以自动地赋值指针并增加计数器,而不需要锁?
- 赋值指针数组
- 如何在c++中赋值指针给this