C++ 访问数组C+的最后一个地址的最安全方法+;

C++ 访问数组C+的最后一个地址的最安全方法+;,c++,arrays,pointers,memory-access,C++,Arrays,Pointers,Memory Access,想象一下: int main (void) { int V[101]; populateSomehow(V); std::sort(V, &V[100]); //which one std::sort(V, V+100); } p> >你可以使用 STD::开始< >代码>::C++结束后,结束< > 11。例如: int V[100]; std::sort(std::begin(V), std::end(V)); 可以使用 STD::开始<

想象一下:

int main (void)
{
    int V[101];
    populateSomehow(V);
    std::sort(V, &V[100]); //which one
    std::sort(V, V+100);
}

<> p> >你可以使用<代码> STD::开始< <代码> >代码>::C++结束后,结束< <代码> > 11。例如:

int V[100];

std::sort(std::begin(V), std::end(V));

可以使用<代码> STD::开始< <代码>和<代码> STD::结束< /代码>,因为C++ 11。例如:

int V[100];

std::sort(std::begin(V), std::end(V));

在C风格中还有另一种方式:

int V[101];

std::sort(V, V + sizeof(V)/sizeof(V[0]));

在C风格中还有另一种方式:

int V[101];

std::sort(V, V + sizeof(V)/sizeof(V[0]));


两者都错过了第101个元素。实际上,只需使用
std::end
,除非您实际上打算对前100个进行排序。@EJP第一个适合这种情况,但如果您想要对整个对象进行排序,则相同的模式不起作用array@EJP,你可以通读这可怕的讨论。C实际上说<代码>和ARR[i] < /C> >等同于代码> ARR+I ,而C++不这样,因此可能的DE>代码< > ARR+I/C>是导致问题的原因。@ EJP似乎没有共识,这是避免它的一个很好的理由,尤其是考虑到一个简单的定义良好的替代方案。这正是Matt的意思,如果对整个阵列进行排序,它将无法工作。在这种情况下,结束指针将超出数组的结尾,然后这个问题开始发挥作用。两者都会错过第101个元素。实际上,只需使用
std::end
,除非您实际上打算对前100个进行排序。@EJP第一个适合这种情况,但如果您想要对整个对象进行排序,则相同的模式不起作用array@EJP,你可以通读这可怕的讨论。C实际上说<代码>和ARR[i] < /C> >等同于代码> ARR+I ,而C++不这样,因此可能的DE>代码< > ARR+I/C>是导致问题的原因。@ EJP似乎没有共识,这是避免它的一个很好的理由,尤其是考虑到一个简单的定义良好的替代方案。这正是Matt的意思,如果对整个阵列进行排序,它将无法工作。在这种情况下,结束指针将超出数组的结尾,然后这个问题开始发挥作用。在C++11之前,您可以使用V+(sizeof(V)/sizeof(V[0])-1。正如chris在问题下的评论中解释的,原始代码没有对整个数组进行排序,所以至少应该指出,这个答案的代码是不等价的。更改数组大小是一件很奇怪的事情,只是混淆了问题。@rcgldr,我不推荐这样做。如果你给它一个指针,它真的不应该编译,因为它不会做正确的事情,但它确实可以编译。问题是从数组中获取指针太容易了。使用
boost::begin
boost::end
,或者自己制作。它们都很简单。或者,您可以创建一个只接受数组并返回大小的函数。请注意,要使其与答案相等,则
-1
应该消失。在C++11之前,您可以使用V+(sizeof(V)/sizeof(V[0])-1。正如chris在问题下的评论中解释的那样,原始代码没有对整个数组进行排序,因此至少应该指出此答案的代码是不相等的。更改数组大小是一件很奇怪的事情,只是混淆了问题。@rcgldr,我不推荐这样做。如果你给它一个指针,它真的不应该编译,因为它不会做正确的事情,但它确实可以编译。问题是从数组中获取指针太容易了。使用
boost::begin
boost::end
,或者自己制作。它们都很简单。或者,您可以创建一个只接受数组并返回大小的函数。请注意,要使其与答案相等,则
-1
应消失。丢失-1。迭代器应该指向最后一个元素之后的一个元素。还请注意,这不适用于动态分配的数组。回答+1<代码>-1与问题匹配-足够公平。嗯,最好写…
sizeof V/sizeof V[0]
。。。所以只有一个地方可以维护数组类型。。。否则代码很容易出错
仅当
sizeof
用于类型而非变量时才需要。计算结束时,这应该有
-1
;问题是如何获取最后一个元素的地址(而不是超过结束地址的地址)。是的,使用sizeof(V[0])相当于更通用。@MattMcNabb:这就是问题所在,但这很可能是因为Lucas认为应该告诉第一个和最后一个元素排序,而不是第一次和最后一次排序实际上需要。。。。一个非常好的答案可以解释其中的含义。丢掉-1。迭代器应该指向最后一个元素之后的一个元素。还请注意,这不适用于动态分配的数组。回答+1<代码>-1与问题匹配-足够公平。嗯,最好写…
sizeof V/sizeof V[0]
。。。所以只有一个地方可以维护数组类型。。。否则代码很容易出错
仅当
sizeof
用于类型而非变量时才需要。计算结束时,这应该有
-1
;问题是如何获取最后一个元素的地址(而不是超过结束地址的地址)。是的,使用sizeof(V[0])相当于更通用。@MattMcNabb:这就是问题所在,但这很可能是因为Lucas认为应该告诉第一个和最后一个元素排序,而不是第一次和最后一次排序实际上需要。。。。一个真正好的答案可以解释其中的含义。