问题标签 [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 - 如何一次为结构中的多个成员赋值
假设我们有一个具有 4 个 1 字节成员的结构。我想使用 Xyz 作为内存地址并将其转换为 32 位指针,然后我将为它分配值。这样,我就可以一次设置所有字节成员。这只是我的问题的一个示例,char、int 或设置为 256 只是任意示例。
在这里,我为按预期工作的数组准备了类似的方法;
如何使用 struct 执行与数组相同的操作?
c - C 错误:获取临时数组的地址
我将二维字符数组作为复合文字传递给方法,但收到错误:
错误:获取临时数组的地址
这是否与在方法声明中声明变量的方式有关,还是其他原因?
c - 为什么不能使用复合文字来分配已定义的、固定大小的数组?
为什么在示例代码中使用复合文字(案例 b)定义结构后可以分配结构,而数组不能(案例 c))?
我知道情况 a) 不起作用,因为此时编译器不知道分配的 rhs 上的内存布局。它可以是任何类型的演员表。但是按照这条线,在我看来,案例 c) 是一个完全明确的情况。
编辑:我知道我不能分配给一个数组——这就是 C 的设计方式。我可以使用 memcpy 或单独分配值。
在阅读了下面的评论和答案之后,我想现在我的问题分解为一个永远争论不休的难题,即为什么不能分配给数组。
正如这篇文章和下面MM的评论所建议的那样,更令人费解的是,以下分配是完全有效的(当然,它违反了严格的别名规则)。您可以将数组包装在结构中并进行一些讨厌的转换来模仿可分配数组。
那么是什么阻止开发人员将这样的功能包含在C22(?)
c - C中的复合文字存储持续时间
有史以来的第一个问题:)
我正在“自己”学习编程,正在阅读KNKing的“C Programming: A modern Approach”。在第 18 章 - 声明中的问答部分,有一个问题是关于为什么选择语句和迭代语句(以及它们的“内部”语句)在 C99 中被视为块。在简要介绍了答案之后,他说:
[...]C99 标准规定,如果复合文字出现在函数体之外,则由复合文字表示的对象具有静态持续时间。否则有自动保存期限;结果,对象占用的内存在复合文字出现的块的末尾被释放[...]
我想我明白了。我试图从函数返回一个指向复合文字的指针,实际上输出是错误的(或者我猜是未定义的)。我的问题如下;他举了这个例子:
紧接着是这样的解释:
每个复合文字都会导致创建一个对象,但该对象仅存在于由包含该文字出现的语句的大括号形成的块中。在
evaluate_polynomial
被调用的时候,coefficients
指向一个不再存在的对象。结果:未定义的行为。
当我在我的计算机上尝试完全相同的代码时(我在 Linux VM 中使用 GCC),我总是得到正确的输出。if
一旦“控制流”退出块,文字似乎不会被释放。
有人可以详细说明一下吗?
谢谢。
c - 对复合文字的赋值有什么用?
我正在阅读复合文字,我看到它们是左值。所以我怀疑你可以分配它们,所以我做了一个实验,我注意到编译时没有警告gcc -Wall -Wextra -pedantic
:
这让我感到困惑,因为我真的看不出任何这可能有用的情况。你什么时候想给复合文字赋值?
还是它是一种常见的未定义行为?因为它看起来很像修改字符串文字。使用与上述相同的参数编译时不会出现警告:
c - 返回复合文字
看看这段代码。我在这里返回复合文字的地址。
输出:
ISO/IEC 9899 说:
如果复合文字出现在函数体之外,则该对象具有静态存储持续时间;否则,它具有与封闭块关联的自动存储持续时间。
即,在to_bar
函数中,由复合文字创建的未命名对象具有自动存储期限。因此,它将在to_bar
. 看来,这段代码会产生未定义的行为(基于标准)。是这样吗?
c - 为什么只读复合文字的值会更改?
我正在研究 C 中的只读复合文字。当我尝试在取消引用运算符的帮助下更改其值时,值发生了变化!我现在很困惑为什么会这样。
此外,当我编译并运行程序(不尝试更改其值)时,它显示此错误:
我不明白为什么它忽略了const
限定符。
我知道const
限定符会丢弃任何更改,但这里复合文字的值发生了变化!
你能解释一下我在哪里犯了错误吗?
我写的程序是这样的:
输出是:
c99 - 在 C99 中的复合文字中使用后缀/前缀增量运算符
有一个从 CARM 借来的示例(CA Reference Manual, Samuel P. Harbison III, Guy L. Steele Jr., 2002, Prentice Hall),第 218-219 页。我在一个源中编写了所有三个代码块:
f2 功能无法正常工作:
但是当我重写它时:
f2 函数工作正常:
为什么 ?f2 函数的这两个变体的不同之处在于 i 的后缀/中缀增量(在复合文字中)返回的值。在第一种情况下,它是临时值。后缀自增运算符的结果不是左值。并且前缀增量运算符的结果也不是左值(根据 CARM 的第 226 页)。请帮我理解。(对不起我的英语不好)。
c - 可以初始化/分配结构指针吗?
假设我有以下结构和两个版本来初始化它:
第二个版本可以直接做吗?还是我需要按照以下方式做一些事情:
CarPtr
或者直接初始化类型的正确方法是什么?