为什么我没有收到任何错误(C 风格转换)

Why I don't get any error (C-style casting)

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;

为什么会这样?

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 风格转换的最后一点注意事项:您应该始终将其视为您做错事情的标志。