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

时间:2019-05-15 18:56:49

标签: 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

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

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

由于函数strcpy要求其第一个操作数是一个数组,我们可以从学上讲应用指针算术吗?

2 个答案:

答案 0 :(得分:7)

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

  

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

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

答案 1 :(得分:2)

是的,因为即使函数strcpy的语义仅在处理数组而不是指针时才有意义,但strcpy(或任何其他函数)却无法分辨它是否是传递了数组或指向数组的指针,因为当数组作为参数传递给函数时,它会衰减为指向其第一个元素的指针。