这是一个语言律师问题。
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
要求其第一个操作数是一个数组,我们可以从学上讲应用指针算术吗?
答案 0 :(得分:7)
当然 s1
并不指向数组,而是指向char
。但是,术语“用法”来自7.1.4p1:
[...]如果将函数参数描述为数组,则实际传递给该函数的指针应具有一个值,以使所有地址计算和对对象的访问都有效(如果指针确实指向这样的数组的第一个元素)实际上是有效的。 [...]
对于strcpy(test + 3, "4567");
,访问test[3 + 0 ... 4]
应该是有效的,如果test
是至少8个字符的数组,则这种情况尤其可能。
答案 1 :(得分:2)
是的,因为即使函数strcpy
的语义仅在处理数组而不是指针时才有意义,但strcpy
(或任何其他函数)却无法分辨它是否是传递了数组或指向数组的指针,因为当数组作为参数传递给函数时,它会衰减为指向其第一个元素的指针。