memcpy传入超出分配内存的指针且长度为0,是否属于未定义行为?
关于memcpy在长度为0时的未定义行为问题
问题代码
uint8_t buffer[16]; uint8_t data[16]; uint8_t buffer_length = 16; uint8_t data_length = 0; memcpy(buffer + buffer_length, data, data_length);
问题解答
是否触发未定义行为?
根据C标准,当memcpy的复制长度参数为0时,函数不会执行任何内存读写操作。buffer + buffer_length是指向数组buffer末尾之后第一个位置的指针,这种指针在C标准中是合法的(被称为“one past the end”指针)——它可用于指针比较等操作,只是不能被解引用。由于此时memcpy不会对该指针进行解引用,因此这个调用不属于未定义行为。是否需要添加额外的if判断?
从代码可读性和避免工具警告的角度,添加if (data_length > 0)的判断是更稳妥的选择:- 部分编译器的debug模式或静态代码分析工具可能会对“指向数组外的指针”发出警告,添加判断可消除这类告警。
- 能明确表达“仅当有数据需要复制时才执行memcpy”的逻辑,让代码意图更清晰。
内容的提问来源于stack exchange,提问作者vbezhenar
相关产品推荐
相关产品推荐

