gpt4 book ai didi

c++ - 为什么这种声明可以在 C++ 中工作?

转载 作者:行者123 更新时间:2023-12-03 07:00:23 25 4
gpt4 key购买 nike

传递 int指向未初始化的指针无法工作。但是传递对未初始化指针的引用是可行的。
这背后的机制是什么?

    int a = 1;
int &r = a;
cout << &a << " " << &r << endl; // 0x61ff10 0x61ff10

// can work
int *p1;
*p1 = r;
cout << p1 << endl; // 0x61ff60

// cannot work
int *p2;
*p2 = a;
return 0;
下面的代码是我如何测试这些奇怪的概念 page 400 of cpp primer plus .
const free_throws & clone(free_throws & ft)
{
free_throws * pt;
*pt = ft; // copy info
return *pt; // return reference to copy
}
P.S.:我尝试更改 a 的值和 cout << *p1始终输出正确的值:
    int a = 3;
int &r = a;
cout << &a << " " << &r << endl;
// can work
int *p1;
*p1 = r;
cout << p1 << endl;

cout << *p1; // always the right value

最佳答案

这个来自 C++ Primer Plus 的代码(你不应该把推荐的书“C++ Primer”和“C++ Primer Plus”混淆)是无效的:

const free_throws & clone(free_throws & ft)
{
free_throws * pt;
*pt = ft; // copy info
return *pt; // return reference to copy
}
显示代码上方的书中的文字说:

A second method is to use new to create new storage. You’ve already seen examples inwhich new creates space for a string and the function returns a pointer to that space.Here’s how you could do something similar with a reference


所以代码看起来像这样(在本书的早期修订版中, new 在那里):
const free_throws & clone(free_throws & ft)
{
free_throws * pt = new free_throws();
*pt = ft; // copy info
return *pt; // return reference to copy
}
new缺少则是未定义的行为。
在代码之后,本书还提到:

This makes jolly a reference to the new structure. There is a problem with thisapproach: You should use delete to free memory allocated by new when the memory is no longer needed.


所以即使使用 new这是一种非常糟糕的代码风格。

i tried to change the value of a and cout << *p1 can always output the correct value

int *p1; *p1 = r;是未定义的行为,编译器可能因此对代码做出错误的假设,导致编译器或优化器创建意外/不可预测的机器代码。
但是对于所显示的代码,在实践中最有可能发生的是:您没有初始化 int *p1;所以 p1持有一个未确定的值,这意味着它指向内存中的任意位置。如果幸运的话,它会指向当前未使用内存的有效内存地址。与 *p1 = r;您写入该内存地址的内存,如果幸运的话,该地址没有任何重要的东西,所以不会发生任何不好的事情,但您仍然在内存中的“随机”位置写入。所以你可能会得到正确的结果,但你的代码仍然无效。
但这只是可能发生的一种可能结果。

关于c++ - 为什么这种声明可以在 C++ 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64603908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com