使用malloc(0)和memcpy

6 c malloc undefined-behavior

我在某处读到:取消引用由大小为零的"新"分配返回的指针是UB.在C中是否相同?如果是,是以下代码UB?(假设大小= 0)

 a->object[index].data = malloc(size);  
 memcpy(a->object[index].data, bytes, size);
Run Code Online (Sandbox Code Playgroud)

据我了解:不.只是想仔细检查一下.

hac*_*cks 9

当你0作为一个参数传递给malloc它时,它free就是指向malloc返回的指针的内存.

结果是实现定义的.

C11:7.22.3内存管理功能:

[...]如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,但返回的指针不应该是用于访问对象.

标准也说:

free函数使得指向的空间ptr被释放,即可用于进一步分配.如果ptr是空指针,则不执行任何操作.

因此,在实现定义行为的任​​何一种情况下,释放都不会调用未定义的行为.

现在转到问题的另一部分.

7.1.4库函数的使用:

如果函数的参数具有无效值(例如函数域外的值,或程序地址空间外的指针,或空指针,或指向不可修改存储的指针,则相应参数不具有const限定条件)或具有可变数量参数的函数不期望的类型(提升后),行为未定义.

C11:7.24.1 p(2):

声明为的参数size_t n指定函数数组的长度,n在调用该函数时可以为零.除非在本子条款中对特定函数的描述中另有明确说明,否则此类调用上的指针参数仍应具有有效值,如7.1.4中所述.在这样的调用中,定位字符的函数不会发生,比较两个字符序列的函数返回零,复制字符的函数复制零个字符.

  • @dmcr_code技术上用空指针调用`memcpy`是UB,即使第三个参数是'0' (4认同)
  • @dmcr_code你应该*总是*在*any*malloc后免费调用.正如规范在这里所说的,它可能会返回,就好像你用非零参数调用它(即分配内存). (2认同)