我在某处读到:取消引用由大小为零的"新"分配返回的指针是UB.在C中是否相同?如果是,是以下代码UB?(假设大小= 0)
 a->object[index].data = malloc(size);  
 memcpy(a->object[index].data, bytes, size);
据我了解:不.只是想仔细检查一下.
当你   0作为一个参数传递给malloc它时,它free就是指向malloc返回的指针的内存.
结果是实现定义的.
[...]如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,但返回的指针不应该是用于访问对象.
标准也说:
该
free函数使得指向的空间ptr被释放,即可用于进一步分配.如果ptr是空指针,则不执行任何操作.
因此,在实现定义行为的任何一种情况下,释放都不会调用未定义的行为.
现在转到问题的另一部分.
如果函数的参数具有无效值(例如函数域外的值,或程序地址空间外的指针,或空指针,或指向不可修改存储的指针,则相应参数不具有const限定条件)或具有可变数量参数的函数不期望的类型(提升后),行为未定义.
声明为的参数
size_t n指定函数数组的长度,n在调用该函数时可以为零.除非在本子条款中对特定函数的描述中另有明确说明,否则此类调用上的指针参数仍应具有有效值,如7.1.4中所述.在这样的调用中,定位字符的函数不会发生,比较两个字符序列的函数返回零,复制字符的函数复制零个字符.