std::array 成员的地址在 C++ 中是否可能为空?
Is it possible for an address of an std::array member to be null in C++?
是否可以修改 a
使 if 语句失败?
std::array<int,4> a = {{1,2,3,4}};
for (int i=0;i<a.size();i++)
{
auto ptr = &a[i];
if (ptr != nullptr)
{
printf("value at %d is %d\n",i,a[i]);
}
else
{
printf("Invalid array\n");
}
}
标准库容器中元素的地址不能为空,只要您正确使用容器的 API。这是因为,假设您满足 API 的所有先决条件,容器保证其所有元素都是有效对象,并且有效对象永远不会有空地址。但是,一旦您违反了先决条件(例如,从空向量中弹出),整个程序就会出现未定义的行为,并且您最终可能会看到 if
语句的“不可能”分支被执行。
例如,在显示的代码段中,尝试访问 a[4]
会给程序带来未定义的行为。它可能不会导致 else
分支被采用,但你永远不知道。
if (ptr != nullptr)
块完全是多余的。它什么都不做。测试永远不会失败。 std::array<int, 4>
是作为局部自动变量创建的,它的所有元素都必须有一个有效地址。
是否可以修改 a
使 if 语句失败?
std::array<int,4> a = {{1,2,3,4}};
for (int i=0;i<a.size();i++)
{
auto ptr = &a[i];
if (ptr != nullptr)
{
printf("value at %d is %d\n",i,a[i]);
}
else
{
printf("Invalid array\n");
}
}
标准库容器中元素的地址不能为空,只要您正确使用容器的 API。这是因为,假设您满足 API 的所有先决条件,容器保证其所有元素都是有效对象,并且有效对象永远不会有空地址。但是,一旦您违反了先决条件(例如,从空向量中弹出),整个程序就会出现未定义的行为,并且您最终可能会看到 if
语句的“不可能”分支被执行。
例如,在显示的代码段中,尝试访问 a[4]
会给程序带来未定义的行为。它可能不会导致 else
分支被采用,但你永远不知道。
if (ptr != nullptr)
块完全是多余的。它什么都不做。测试永远不会失败。 std::array<int, 4>
是作为局部自动变量创建的,它的所有元素都必须有一个有效地址。