【发布时间】:2020-12-03 14:29:19
【问题描述】:
来自Stroustrup - 编程:使用 C++ 的原则和实践一书。在§17.3中,关于内存、地址和指针,应该允许将char*分配给int*:
char ch1 = 'a';
char ch2 = 'b';
char ch3 = 'c';
char ch4 = 'd';
int* pi = &ch3; // point to ch3, a char-size piece of memory
*pi = 12345; // write to an int-size piece of memory
*pi = 67890;
我们有这样的图形:
引用来源:
如果编译器允许该代码,我们就会将
12345写入从&ch3开始的内存。这肯定会改变附近一些内存的值,例如ch2或ch4,或者我们会覆盖pi本身的一部分。
在这种情况下,下一个赋值
*pi = 67890会将67890放在内存的某个完全不同的部分。
我不明白,为什么下一个作业会把它放在:内存的某个完全不同的部分?存储在int *pi 中的地址仍然是&ch3,因此分配将覆盖该地址的内容,即12345。为什么不是这样?
拜托,你能帮帮我吗?非常感谢!
【问题讨论】:
-
&ch3导致char*不是int*,因此如果没有reinterpret_cast我不会这样做,那么分配是非法的。但我认为他们的观点是,如果sizeof(int) > sizeof(char)然后写入pi将写入ch3分配的内存,一直到pi本身的前几个字节(见图。因此下一个derefence 将是其他地址,因为pi指针本身被意外修改。 -
这只是demons fly out of your nose 时发生的简单示例。第一个赋值(部分)破坏了
pi本身的值。 -
reinterpret_cast是通往许多被某些人认为是……不自然的能力的途径 -
@FrançoisAndrieux 这本书使用了 C++11 和 C++14。
-
@JB-Franco 我已经删除了 C 标签。
标签: c++ pointers memory-address dereference