当我无法移动/复制memmove()/ memcpy()作为边缘情况时,我是否需要处理案例
int numberOfBytes = ...
if( numberOfBytes != 0 ) {
memmove( dest, source, numberOfBytes );
}
Run Code Online (Sandbox Code Playgroud)
或者我应该在没有检查的情况下调用该函数
int numberOfBytes = ...
memmove( dest, source, numberOfBytes );
Run Code Online (Sandbox Code Playgroud)
是否需要检查前片段?
我不太熟悉C标准,所以请耐心等待.
我想知道,按标准保证memcpy(0,0,0)是否安全.
我能找到的唯一限制是,如果内存区域重叠,那么行为是未定义的......
但我们可以认为这里的内存区域重叠吗?
正如其他地方所解释的那样,调用memcpy无效或NULL指针等函数是未定义的行为,即使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);
}
Run Code Online (Sandbox Code Playgroud)
如果我们想在数组的末尾插入,index则等于length并array + index + 1指向刚好超过数组的末尾,但复制元素的数量为零.