gpt4 book ai didi

C++ 内存测试返回奇怪的输出

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:57 25 4
gpt4 key购买 nike

这里是 Slackware。我只是在摆弄内存和指针......我想更多地了解这些,所以我用 C++ 创建了一个数组,并查找了其中第一项的内存地址......:

string foo[3] = {"a", "b", "c"};
cout << *(&foo[0]-4) << endl;

它输出了这个:http://pastebin.com/K0HAL5nJ完整代码:

#include <iostream>

using namespace std;

int main()
{
string foo[3] = {"a", "b", "c"};
cout << &foo[0] << " minus " << &foo[1] << " equals " << int(&foo[0])-int(&foo[1]) << endl;
cout << *(&foo[0]-4) << endl;
cout << "Hello world!" << endl;
return 0;
}

我是 C++ 的完全初学者,完全不明白为什么会发生这种情况……我知道这种代码不应该……是,但是,有人能解释一下那里发生了什么吗?

最佳答案

这是未定义的行为。 &foo[0] 为您提供第一个 std::string 对象的地址,然后您可以从中减去 4。来自 §5.7 加法运算符:

If both the pointer operand and the result point to elements of the same array object, or one past the last element of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined.

未定义的行为意味着您可以体验任何事情。可能发生的情况是内存的某个区域,数组开头之前的四个位置,这不是有效的 std::string 对象被视为 std::string。这势必会导致丑陋的事情发生。

关于C++ 内存测试返回奇怪的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15560763/

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