递增指向0大小的动态数组的指针是否未定义?

Ita*_*iwa 32 c++ pointers undefined-behavior dynamic-arrays

AFAIK,尽管我们无法创建大小为0的静态内存数组,但是我们可以使用动态数组来做到这一点:

int a[0]{}; // Compile-time error
int* p = new int[0]; // Is well-defined
Run Code Online (Sandbox Code Playgroud)

如我所读,p行为就像一个过去的元素。我可以打印p指向的地址。

if(p)
    cout << p << endl;
Run Code Online (Sandbox Code Playgroud)
  • 尽管我确定我们不能像使用迭代器(过去元素)那样取消引用该指针(过去元素),但是我不确定是否要增加该指针p?是否像迭代器一样具有未定义的行为(UB)?

    p++; // UB?
    
    Run Code Online (Sandbox Code Playgroud)

int*_*jay 31

指向数组元素的指针可以指向有效元素,也可以指向末尾。如果以超过末尾一个以上的方式递增指针,则该行为是不确定的。

对于大小为0的数组,p已经指向末尾一个,因此不允许对其进行递增。

有关+运算符,请参见C ++ 17 8.7 / 4 (++具有相同的限制):

f表达式P指向具有n个元素x[i]的数组对象的x元素,如果0?i + j?n ,则表达式P + JJ + P(其中J的值是j)指向(可能是假设的)元素x[i+j];否则,行为是不确定的。

  • @RamiYen`x [i]`与`x [i + j]`是相同的元素,如果`j == 0'。 (8认同)
  • @ einpoklum-reinstateMonica:确实没有暮光区。即使对于N = 0情况,也只是C ++是一致的。对于N个元素的数组,有N + 1个有效的指针值,因为您可以指向数组的后面。这意味着您可以从数组的开头开始,然后将指针递增N次才能到达结尾。 (4认同)
  • 因此,唯一的情况是x [i]和x [i + j]相同,而i和j都为0? (2认同)