Как ответил в другом месте, вызов таких функций, как memcpy
с недопустимыми или NULL
указателями, - это поведение undefined, даже если аргумент length равен нулю. В контексте такой функции, особенно memcpy
и memmove
, является указателем за конец массива действительным указателем?
Я задаю этот вопрос, потому что указатель, который находится за концом массива, является законным для получения (в отличие от, например, указателя на два элемента за конец массива), но вам не разрешено разыгрывать его сноска 106 стандарта ISO 9899: 2011 указывает, что такой указатель указывает на адресное пространство программы, критерий, необходимый для того, чтобы указатель был действительным в соответствии с §7.1.4.
Такое использование происходит в коде, где я хочу вставить элемент в середину массива, требуя, чтобы я переместил все элементы после точки вставки:
void make_space(type *array, size_t old_length, size_t index)
{
memmove(array + index + 1, array + index, (old_length - index) * sizeof *array);
}
Если мы хотим вставить в конец массива, index
равно length
и array + index + 1
указывает только конец конца массива, но число скопированных элементов равно нулю.