我有以下代码:

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);

memcpy应该是无操作的,因为data_length是零.然而,buffer + buffer_length点正好在分配的内存之外.我想知道这是否会引发某种不确定的行为?我是不是应该把这个memcpy包在另外if个包里?

我明白,任何合理的memcpy实现都可以很好地工作,但是这个问题更多的是从代码正确性的Angular 和避免未定义的行为.

推荐答案

正如Stephen C的回答所指出的,C17规范对于这是否定义良好有点含糊.

然而,C23规范在7.1.4部分的脚注中澄清了这一点,声明

如果将函数参数描述为数组,则传递给该函数的指针应 具有这样一个值,即所有的地址计算和对对象的访问(如果 指针确实指向这种数组的第一个元素)是有效的.

脚注(235)写道:

例如,这包括传递一个大小为0的指向数组末尾的有效指针,或使用大小为0的任何有效指针.

句子的第一部分明确定义了OP的情况.

添加这一陈述可以被视为承认C17规范在这一点上不够清楚,因此,不能排除C17编译器的实现者可能善意地解释该标准,使得这种情况不是定义的行为.

然而,C23应该会消除这种不确定性.

C++相关问答推荐

try 使用sigqueue函数将指向 struct 体的指针数据传递到信号处理程序,使用siginfo_t struct 体从一个进程传递到另一个进程

__VA_OPT__(,)是否可以检测后面没有任何内容的尾随逗号?

核心转储文件中出现奇怪的大小变化

LibpCap禁用监视器模式(C、MacOS)

ATmega328P EEPROM未写入

C是否用0填充多维数组的其余部分?

C lang:当我try 将3个或更多元素写入数组时,出现总线错误

如何在C中使printf不刷新标准输出?

Sizeof(&Q;字符串&Q;)的正确输出是什么?

加密解密工作正常,但返回错误0x80090005

如何在STM8项目中导入STM8S/A标准外设库(ST VisualDeveloper)?

C I/O:在Windows控制台上处理键盘输入

C语言中的数字指针

使用Open62541向OPCUA服务器发送读请求时内存泄漏

STM32 FATFS用户手册(Um1721)中的代码正确吗?

在printf()中用%.*S格式填充长度为0的字符串是否会调用任何UB?如果是,是哪一个?

从Raku nativecall调用时精度不同

使用替代日历打印日期

在 C 中传递参数时出现整数溢出

变量的指针右对齐,函数的指针左对齐