Применение strcpy к указателю на массив + some_offset - PullRequest
4 голосов
/ 15 мая 2019

Это вопрос языка-юриста.

Описание функции 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 th-й элемент можно считать указателем на первый элемент массива n - i элементов ".

Поскольку функция strcpy требует, чтобы ее первый операнд был массивом, мы можем педантичноговоря применить арифметику указателя, как я показал выше?

Ответы [ 2 ]

7 голосов
/ 15 мая 2019

Конечно s1 не указывает на массив, он указывает на char. Но термин «использование» происходит от 7.1.4p1 :

[...] Если аргумент функции описывается как массив, указатель, фактически переданный функции, должен иметь значение, такое, что все вычисления адреса и доступ к объектам (это было бы допустимо, если бы указатель указывал на первый элемент такого массива) действительно действителен. [...]

Для strcpy(test + 3, "4567"); доступ test[3 + 0 ... 4] должен быть действительным, что, в частности, имеет место, если test является массивом не менее 8 символов.

2 голосов
/ 15 мая 2019

Да, потому что, хотя семантика функции strcpy имеет смысл только при работе с массивами вместо указателей, у strcpy (или любой другой функции) нет способа определить, был ли передан массив илиуказатель на массив, поскольку, когда массив передается в качестве аргумента функции, он распадается на указатель на свой первый элемент.

...