C++ 访问指向空向量元素的指针是一种未定义的行为吗?

C++ 访问指向空向量元素的指针是一种未定义的行为吗?,c++,C++,此代码按预期工作: std::vector<unsigned char> tab; if(!&tab[0])std::cout<<"null"; std::vector选项卡; if(!&tab[0])std::cout我不确定您指的是单元化(向量元素)还是(未初始化向量)元素,但您的示例两者都不是。它是零元素的初始化向量 a.operator[n]被定义为语义为*(a.begin()+n),对于空向量,使用begin=end,可以取消对end迭代器的引用。行为

此代码按预期工作:

std::vector<unsigned char> tab;
if(!&tab[0])std::cout<<"null";
std::vector选项卡;
if(!&tab[0])std::cout我不确定您指的是单元化(向量元素)还是(未初始化向量)元素,但您的示例两者都不是。它是零元素的初始化向量


a.operator[n]
被定义为语义为
*(a.begin()+n)
,对于空向量,使用begin=end,可以取消对end迭代器的引用。行为是未定义的。

您编写代码的方式肯定涉及未定义的行为,这是一种不好的做法,因为它访问未初始化的内存

然而,这将是完全合法的:

std::vector<unsigned char> tab(1);
if(!&tab[0])std::cout<<"null";
std::vector选项卡(1);

if(!&tab[0])std::coutOf当然是UB。元素未初始化。它不存在。@LogicStuff:
取消初始化向量
Element“按预期工作”是什么意思?那么你的预期是错误的:PIt不打印空的。使用未定义的行为编写代码比“糟糕的做法”更糟糕。然而,这是完全正确和合法的:“正确,但不是很有用。”。如果
中的内容是死代码,@Jahid如果指针指向数据(它是死代码),则不会打印null。如果您希望代码检查向量是否有任何数据,那么应该编写类似于
If(tab.size()==0)std::cout@LogicStuff“default constructed”值的内容。