【发布时间】:2014-12-20 02:17:27
【问题描述】:
int main()
{
char* p = new char('a');
*reinterpret_cast<int*>(p) = 43523;
return 0;
}
这段代码运行良好,但它的安全性如何?它应该只分配一个字节的内存,但用数据填充 4 个字节似乎没有任何问题。未分配的其他 3 个字节会发生什么情况?
【问题讨论】:
标签: c++ memory-management
int main()
{
char* p = new char('a');
*reinterpret_cast<int*>(p) = 43523;
return 0;
}
这段代码运行良好,但它的安全性如何?它应该只分配一个字节的内存,但用数据填充 4 个字节似乎没有任何问题。未分配的其他 3 个字节会发生什么情况?
【问题讨论】:
标签: c++ memory-management
char* p = new char('a');
'a'的ASCII码是97,所以相当于:
char* p = new char(97);
用*p='a'分配单个字符(1字节)空间
现在,您尝试输入超过 1 字节的值,这肯定是有风险的,即使这样可行,我的意思是运行时没有任何分段错误。您正在覆盖您不拥有的其他一些内存部分,或者即使拥有,也必须用于其他目的。
【讨论】:
代码不安全。您的程序具有未定义的行为。任何事情都有可能发生。
【讨论】:
代码导致堆缓冲区溢出。您正在覆盖您不拥有并且可以在程序的其他部分中使用的内存。
【讨论】: