为何给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
相关产品推荐
相关产品推荐

