gpt4 book ai didi

c++ - 字符串 ; &s+1;合法的?乌布?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:54:45 24 4
gpt4 key购买 nike

考虑以下代码:

#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
string myAry[] =
{
"Mary",
"had",
"a",
"Little",
"Lamb"
};
const size_t numStrs = sizeof(myStr)/sizeof(myAry[0]);

vector<string> myVec(&myAry[0], &myAry[numStrs]);

copy( myVec.begin(), myVec.end(), ostream_iterator<string>(cout, " "));

return 0;
}

这里感兴趣的是 &myAry[numStrs]:numStrs 等于 5,所以 &myAry[numStrs] 指向不存在的东西;数组中的第六个 元素。在上面的代码中还有另一个这样的例子:myVec.end(),它指向 vector myVec的最后一个。获取这个不存在的元素的地址是完全合法的。我们知道 string 的大小,因此我们知道 string 的 C 风格数组的第 6 个元素的地址必须指向何处。只要我们只评估这个指针并且从不取消引用它,我们就没问题。我们甚至可以将它与其他指针进行比较以获得相等性。 STL 在作用于一系列迭代器的算法中一直这样做。 end() 迭代器指向末尾,循环在计数器 != end() 时继续循环。

现在考虑一下:

#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
string myStr = "Mary";
string* myPtr = &myStr;
vector<string> myVec2(myPtr, &myPtr[1]);

copy( myVec2.begin(), myVec2.end(), ostream_iterator<string>(cout, " "));

return 0;
}

此代码是否合法且定义明确?像 &myAry[numStrs] 一样,将数组元素的地址取到末尾是合法且定义明确的,因此假装 myPtr< 也应该是合法且定义明确的 也是数组?

最佳答案

拥有一个指向数组“末尾后的一个”的指针是合法的而不是 UB,并且任何单个对象都可以被视为在长度为 1 的数组中;但是,由于 &ptr[1] 取消引用然后获取地址的技术性,您需要改用 ptr + 1。这也适用于 &array[size] 变成 array + size

您所拥有的将在我所知道的所有平台上按预期工作,但考虑到使用明确正确的形式是多么容易,我认为没有理由不这样做。

关于c++ - 字符串 ; &s+1;合法的?乌布?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2405555/

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