将strcpy应用于指向数组+ some_offset的指针

Som*_*ame 4 c arrays pointers language-lawyer

这是一个语言律师问题。

strcpy功能的描述在7.24.2.3(p2)

strcpy函数将s2指向的字符串(包括终止空字符)复制到s1指向的数组中。

因此,请考虑以下代码:

char test[8] = "123";
strcpy(test + 3, "4567");
printf("%s\n", test); //1234567
Run Code Online (Sandbox Code Playgroud)

它可以按预期工作,但是我对所指向的对象感到困惑test + 3。显然,由指向的对象test已声明type char[8]。但据我所知,该标准并未明确定义以下内容:

“如果我们有一个n元素数组,则指向该元素的指针i < n可以被视为指向元素数组的第一个元素的指针n - i”。

由于该函数strcpy要求其第一个操作数为数组,因此我们可以像上面显示的那样简单应用指针算法吗?

Ant*_*ala 7

当然 s1不指向数组,而是指向char。但是,术语“用法”来自7.1.4p1

[...]如果将函数参数描述为数组,则实际传递给函数的指针应具有一个值,以使所有地址计算和对对象的访问都有效(如果指针确实指向第一个元素,这将是有效的实际上是有效的。[...]

对于strcpy(test + 3, "4567");访问test[3 + 0 ... 4]而言,如果test是至少8个字符的数组,则应该是有效的,尤其是这种情况。