You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何给memcpy传入常量数组仍可正常运行?(int[3]){7,8,9}返回首元素指针吗

关于C语言复合字面量的问题解答

首先直接回答你的核心疑问:(int[3]) { 7, 8, 9 }在表达式场景下的求值结果确实是该匿名数组首元素的指针,这是符合C语言标准的行为,具体说明如下:

  • 这个写法是C99标准引入的复合字面量语法,作用是创建一个指定类型的匿名对象。你写的(int[3]) { 7, 8, 9 }本质就是在当前作用域创建了一个匿名的int类型数组,初始化值为7、8、9,和你先定义int tmp[3] = {7,8,9}再用tmp作为参数传入的效果完全一致。
  • C语言有默认的数组隐式转换规则:除了sizeof、取地址&等少数特殊场景外,所有数组类型的表达式都会自动转换为指向数组首元素的指针,因此这个匿名数组传入memcpy时,实际传递的就是首元素的int*指针。
  • 你不需要手动把它转成const void*也能编译通过是正常的:C语言允许普通对象指针隐式转换为void*类型,同时也允许非const指针隐式转换为带const限定的同类型指针,因此int*转const void*是完全合法的隐式转换,不需要额外强转。

额外注意事项:
如果是在函数内部定义的没有加static修饰的复合字面量,属于自动存储期,生命周期和当前作用域绑定,不要在作用域外持有它的指针访问,否则会出现野指针问题。

内容的提问来源于stack exchange,提问作者subski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:09:03