【发布时间】:2018-01-02 06:48:33
【问题描述】:
我从this question 了解到,递增 NULL 指针或递增超过数组末尾不是明确定义的行为:
int* pointer = 0;
pointer++;
int a[3];
int* pointer2 = &a[0];
pointer2 += 4;
但是如果指向一个无效位置的指针只用于比较,而他所在位置的内存永远不会被访问呢?
例子:
void exampleFunction(int arrayLen, char** strArray)
{
for(char** str = strArray; str < strArray + arrayLen; str++) //or even str < &strArray[arrayLen]
{
//here *str is always a pointer to the first char of my string
}
}
在这里,我将指针与数组末尾后一个元素的指针进行比较。这是明确定义的行为吗?
【问题讨论】:
-
*argv + argc这个表达式什么时候有意义?argv[0]的长度与argc无关。如果您的意思是argv + argc,那么 AIUI 很好,因为指针“数组末尾之后的一个元素”是明确定义的,并且可以与同一数组中的其他指针进行比较。 (或者argv + argc + 1,因为正如chux 所说,argv以NULL结尾。) -
@chux 很高兴知道!然后我只需要使用
<=。但是最初的问题不应该考虑我的错误。更新了更好的例子 -
您的第二个代码没问题,因为
str始终是一个有效的指针。不过,它的最后一个值是不可取消引用的。 -
编辑后的表达式
*strArray + arrayLen仍然没有意义。 -
在数组末尾增加 一步 就可以了。进一步增加不是。
pointer2 += 4是未定义的行为,但pointer2 += 3不会是,即使它会导致pointer2指向数组的末尾。
标签: c arrays pointers undefined-behavior