【问题标题】:Why I don't get any error (C-style casting)为什么我没有收到任何错误(C 样式转换)
【发布时间】:2021-12-05 13:00:26
【问题描述】:
char c{ 10 };
int* i = (int*)&c;
*i = 1; // Run-Time Check Failure #2 - Stack around the variable 'c' was corrupted.

但在这种情况下我没有收到任何错误

char* c = new char{ 10 };
int* i = (int*)&c;
*i = 1;
//delete c;

为什么会这样?

【问题讨论】:

  • 请注意,没有出现错误并不意味着它是正确的,只是编译器没有检测到问题(在 C++20 之前你所做的显然是不允许的)。
  • 感谢您的帮助!

标签: c++ casting stack runtime-error dynamic-memory-allocation


【解决方案1】:

int* i = (int*)&c;

您让i 指向变量c 本身,而不是c 实际指向的位置。

因此*i = 1 将改变指针变量c 的值而不是*c 的值。

如果您想获得相同(或相似)的行为,您应该让 i 指向 c 指向的位置:

int* i = (int*) c;

至于为什么它不会给你任何错误,这是因为在现代系统上int 是 32 位宽,而指针(如 c)将是至少 32 位宽(以及 64 位系统上的 64 位)。


最后,关于在 C++ 中进行 C 风格转换的注意事项:您应该始终将其视为您做错了什么的标志。

【讨论】:

  • 需要明确的是,如果您不启用地址清理程序,您最新的演员表在某些情况下也不会导致错误。堆中的内存是由可能超过请求大小的块分配的,所以int* i = (int*)c 仍然可以指向一些“有效”(对于操作系统)内存,所以如果你足够“幸运”,你甚至不会得到“分段错误” .
  • 某程序员老兄,Pavel.Zh 谢谢大家的解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多