问题标签 [compound-literals]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 在分配指针时使用指向的内容
我一直认为,在读取赋值中的正确表达式后缺少序列点会使如下示例产生未定义的行为:
但是,这是 C11 标准委员会草案中“6.5.2.5 复合文字”下的示例 2,版本标识为 n1570,我理解为最终草案(我无权访问最终版本)。
所以,我的问题是:标准中有什么东西可以给出这种定义和指定的行为吗?
编辑
我想准确地解释一下我所看到的问题,以回应一些已经出现的讨论。
根据 dbush 给出的答案中引用的标准的 6.5p2,我们有两个条件明确声明分配具有未定义的行为:
1) 标量对象的副作用相对于同一标量对象的不同副作用是无序的。
2) 相对于使用相同标量对象的值的值计算,对标量对象的副作用是无序的。
第 1 项的示例是“i = ++i + 1”。在这种情况下,由于 ++i 将值 i+1 写入 i 的副作用相对于将 RHS 分配给 LHS 的副作用是无序的。在每一侧的值计算和将 RHS 分配给 LHS 之间存在一个序列点,如下面 Jens Gustedt 的回答中给出的 6.5.16.1 中所述。但是,由于 ++i 对 i 的修改不受该序列点的约束,否则将定义行为。
在我上面给出的例子中,我们有类似的情况。有一个值计算,它涉及创建一个数组并将该数组转换为指向其第一个元素的指针。将值写入该数组的一部分还有一个副作用, *p 写入第一个元素。
所以,我看不出我们在标准中有什么保证,即在将数组地址写入 p 之前,将对数组中未初始化的第一个元素的修改进行排序。这种修改(将 *p 写入第一个元素)与将 i+1 写入 i 的修改有何不同?
换句话说,假设一个实现将示例中感兴趣的语句视为三个任务:第一,为复合文字对象分配空间;第二:将指向所述空间的指针分配给p;第 3 步:将 *p 写入新分配空间中的第一个元素。RHS 和 LHS 的值计算将在赋值之前进行排序,因为计算 RHS 的值只需要地址。这种假设的实现在哪些方面不符合标准?
c - 来自 GCC 但不是 Clang 的复合文字和指定初始化程序警告
用gcc -std=c99 -Wextra
这段代码编译:
给我一个警告:
但是指定的初始化程序应该将其余成员初始化为零,即使它们被省略。
为什么要发出警告?(clang
编译相同的代码没有警告)
c - 使用复合文字初始化指向结构的指针
我是 C 新手,我正在尝试理解复合文字的语法。我的问题类似于在 C 中初始化指向复合文字的指针,但我认为这并不能解决问题。如果有一个结构和一个类型定义为指向结构的指针,如下所示:
然后我可以创建一个thing_t
这样的:
我想知道是否有一种方法可以在thing_t
不显式引用的情况下初始化 a struct thing
,例如,我尝试这样做以查看它是否是有效的语法:
但编译器错误。编译器必须“知道”该thing_t
类型包含一个指向 a 的指针thing
,但是是否存在允许在这种情况下互换使用两者的语法?
(我对此没有特定的用例,我只是想了解类型和结构是如何相关的)。
c - 结构与字符串文字?只读与读写?
C99 标准是否允许写入复合文字(结构)?似乎它不提供对文字字符串的写入。我问这个是因为它在C Programming: A Modern Approach, 2nd Edition on page 406 中说。
问:允许指向复合文字的指针似乎可以修改文字。是这样吗?
答:是的。复合文字是可以修改的左值。
但是,我不太明白它是如何工作的,以及它如何与你当然无法修改的字符串文字一起工作。
您可以在我的段错误列表中看到,写入会baz->a
导致段错误。但是,写入baz->g
不会。为什么其中一个会导致段错误而不是另一个?结构文字与字符串文字有何不同?为什么不将结构文字也放入内存的只读部分,并且为这两者定义或未定义行为(标准问题)?
c - 复合文字和指针
以这种方式使用复合文字初始化指针是安全的,而且完全有可能?:
输出:
我不明白它是如何工作的,它与带有局部变量的 init 指针不一样吗?
如果我尝试打印:
什么都没有打印。
c - 当返回指向复合文字的指针时,gcc 和 clang 不会发出警告
基于https://en.cppreference.com/w/c/language/compound_literal的解释:
如果复合文字出现在文件范围内,则复合文字评估的未命名对象具有静态存储持续时间;如果复合文字出现在块范围内,则具有自动存储持续时间(在这种情况下,对象的生命周期在封闭块的末尾结束)。
但是这段代码在 gcc 和 clang 中编译(和工作)都很好,没有警告(所有警告都打开):
据我了解,这段代码与以下代码相同:
返回:
c - 如何将指向结构的指针数组传递给函数?
考虑一个表示笛卡尔坐标点的结构。
我有一个函数,它接收一堆点并根据传递的点绘制一条曲线,其定义如下所示,
我已经编写了函数bezier
,我想测试我的函数是否正常工作。因此,在主函数内部,我通过复合文字将以下虚拟值传递给函数,
LLVM 给了我以下错误,
我什至尝试过这样的事情,
但这也行不通。我的逻辑是这样的:(point_t*){.x=1.0, .y=1.0}
创建一个指向临时结构的指针,然后在波浪形括号内的一堆结构指针创建一个我可以传递给函数的指针数组。
我错过了什么?为什么代码不起作用?
c - C - 创建一个匿名结构实例
在这段代码中,一个结构体定义如下:
后来用这种方式:
该行return ( Pos ){ f->line, f->column + delta }
似乎正在创建Pos
具有初始化值的结构的匿名实例。这种技术叫什么,它是如何工作的?我在哪里可以了解更多信息?
c - 使用 const 复合文字的元素初始化静态变量
复合文字是变量const
的有效初始化程序吗?static
编辑:
第一条评论中可能的重复是没有意义的,因为我明确地询问const
文字,而不是变量。
c - 如何在C中更改结构的数组成员
我正在尝试对微控制器进行编程,使其能够与利用 SPI 的外部闪存芯片进行通信。操作码(操作码)后跟地址字节,然后是数据字节,必须按顺序发送。而不是每次为不同的命令定义这些字节,我想创建一个保持这个特定顺序的结构。另外我想更改结构内的整个数组。
我试图创建具有三个成员的结构,如操作码、地址和数据。
但是,这行不通,是我的结构想法错误还是语法。我对这个概念很陌生。