指向地址结构错误CDCDCD的c++结构指针
c++ struct pointer to adress struct error CDCDCD
struct XYZ {
XYZ *adress;
};
XYZ *Ex;
int main() {
Ex = new XYZ[3];
Ex->adress = (++Ex);
cout << Ex->adress << endl;
Ex->adress = (++Ex);
cout << Ex->adress << endl;
Ex->adress = (--Ex)->adress;
cout << Ex->adress << endl;
输出:
0105E4240105E4280105E424
struct XYZ {
XYZ *adress;
};
XYZ *Ex;
void copy_adress(XYZ *Ex) {
Ex->adress = (++Ex);
}
int main() {
Ex = new XYZ[3];
copy_adress(Ex);
cout << Ex->adress << endl;
Ex->adress = (++Ex);
cout << Ex->adress << endl;
Ex->adress = (--Ex)->adress;
cout << Ex->adress << endl;
输出:
CDCDCDCD00A3E53CCDCDCD
你能告诉我为什么会发生这种情况,以及我如何修复它吗?
当您复制指针或将其传递给函数时,指针的行为就像常规对象一样。对副本的更改不会反映在原件中。要使函数中的更改可见,您需要引用它:
void copy_adress(XYZ *&Ex) {
Ex->adress = (++Ex);
}
现在,这两个版本是等效的。
(这是补充信息,cigien回答了主要问题(
关于CCD_ 1的测序,评论中有一些猜测。由于C++17,=
的右操作数在左操作数之前排序。由于C++11,两个操作数都在赋值前排序。
因此++Ex
被完成,然后Ex
的新值被用于计算Ex->address
。在C++17之前,这是未定义的行为。
第二个代码示例确实有UB,但原因不同:读取未初始化的内存:
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 奇怪的结构&GCC&clang(void*返回类型)
- 在 c++ 中拥有一组结构的正确方法是什么?
- vscode g++链路故障:体系结构x86_64的未定义符号
- C++概念:如何使用'concept'检查模板化结构的属性?