相关疑难解决方法(0)

我可以调用memcpy()和memmove()并将"字节数"设置为零吗?

当我无法移动/复制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 c++ pointers memcpy memmove

91
推荐指数
2
解决办法
3万
查看次数

保证执行memcpy(0,0,0)是否安全?

我不太熟悉C标准,所以请耐心等待.

我想知道,按标准保证memcpy(0,0,0)是否安全.

我能找到的唯一限制是,如果内存区域重叠,那么行为是未定义的......

但我们可以认为这里的内存区域重叠吗?

c memcpy null-pointer language-lawyer

72
推荐指数
2
解决办法
2万
查看次数

在刚刚超过数组末尾的指针上调用长度为零的memcpy是否合法?

正如其他地方所解释的那样,调用memcpy无效或NULL指针等函数是未定义的行为,即使length参数为零.在这样的功能,特别是上下文memcpymemmove,是一个指针刚刚过去的阵列的有效指针的结束?

我问这个问题是因为一个指针刚好超过一个数组的末尾是合法的(相反,例如一个指针超过一个数组末尾的两个元素),但你不能取消引用它,但是脚注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则等于lengtharray + index + 1指向刚好超过数组的末尾,但复制元素的数量为零.

c pointers undefined-behavior language-lawyer

22
推荐指数
3
解决办法
4144
查看次数