问题标签 [flexible-array-member]
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 - 结构内的未大小数组声明好吗?
以下是否应该对 的声明有效table_type
,特别是e[]
:
所有这些都是打印出表格中每一行的 e 元素。这是输出,这显然是愚蠢的:
i=0 j=0 k=4
i=0 j=1 k=9
i=0 j=2 k=10
i=0 j=3 k=11
i=0 j=4 k=12i=1 j=0 k=13
i=1 j=1 k=18
i=1 j=2 k=19
i=1 j=3 k=20
i=1 j=4 k=21i=2 j=0 k=22
i=2 j=1 k=27
i=2 j=2 k=28
i=2 j=3 k=29
i=2 j=4 k=30i=3 j=0 k=31
i=3 j=1 k=36
i=3 j=2 k=37
i=3 j=3 k=38
i=3 j=4 k=39i=4 j=0 k=40
i=4 j=1 k=45
i=4 j=2 k=46
i=4 j=3 k=47
i=4 j=4 k=48i=5 j=0 k=49
i=5 j=1 k=50
i=5 j=2 k=51
i=5 j=3 k=52
i=5 j=4 k=53
请注意,当 时在最后一个块中是正确的i=5
。当我用 替换e[]
时e[5]
,输出都是正确的。我正在使用 CCS C 编译器和 Microchip 微控制器。我只是好奇这是一个错误还是什么。
c - C中的灵活数组和取消引用类型双关指针错误
当我尝试编译下面的代码时,gcc -O3 -Wall -Werror -std=c99 main.c
我在#3 中收到类似“取消引用类型双关指针将破坏严格别名规则”的错误,但在#2 或#1 中没有。我可以取消引用类型双关的“char *”,但为什么我不能对灵活数组做同样的事情呢?
编辑1: 下面有更具体的例子显示问题:
c++ - C ++“替代”具有灵活数组成员的结构
考虑以下以灵活数组成员结尾的 C99 结构:
len
,例如,使用这样的内联函数(要放入头文件)访问,buf
作为它的参数:
这是一个库的一部分,用 C 编译器编译。但是,我想从 C++ 访问这个库;这实质上意味着相应的头文件(带有适当的extern "C" {...}
保护)必须是有效的 C++ 代码。一个可能的解决方案是slen
在源代码体中定义函数,完全避免内联代码,但这不是最优的。
我的想法是定义一个有效的虚拟 C++ 结构,并且我可以以某种方式映射到hdr
,例如
请注意,我只想为len
and获得正确的(负)偏移值free
;不buf
打算访问。
现在我的问题是:是否有任何保证
工作,给出相同的结果?
c - 将灵活的数组成员分配为结构
我对指针和东西了解更多,但我不知道我在这里做错了什么。如果我有 char *(*data)[] 那只会被解释为“指向 char 指针数组的指针”,对吗?然后我有一个像这样的结构,typedef'd 是 myStruct,虽然它可能是多余的,但这是题外话:
在网站上查看了类似的帖子后,我得到了这样的信息:
我确信我分配结构的数字是数组的大小。我不能完全理解这个,如果它是一个结构,它是如何工作的?这里的计划是拥有这个结构,它包含一个由 5 个 myStruct 组成的数组。我是否也必须单独分配它们?像这样?
我试过了,它一直给我一个错误,说 Invalid use of array with unspecified bounds。我做错了什么或者我该如何解决这个问题?谢谢
c - devm_kzalloc 的问题
我正在尝试了解 devm_kzalloc() 函数的实现。它分配的内存超过了请求的内存(sizeof(struct devres) + size) 来管理资源。
struct devres 定义如下,第二个成员是一个不完整的数组。
以下是分配内存的来源。
我有以下疑问。. 它正在计算 tot_size,但在 struct devres 中,数组不完整。. devm_kzalloc() 函数(如下所示)返回 dr->data 作为请求内存的开始。如果我们知道数组名称包含该数组的起始地址,那么我们分配的内存比请求的内存要多。即 unsigned long long + 大小的大小。
你能帮我理解这一点吗?
memory-management - 如何分区和使用与 Rust 一起分配的堆内存?
我最近读了很多关于 Rust 的文章,但仍然只是开始氧化。我的大脑保留了它的大部分 C/C++ 反应,所以如果这个问题不相关,请原谅我,因为 Rust 是如何完成的。
通常是否有可能(可取?)在堆上分配任意大小的块,然后在其上映射数据结构,绑定获取较小内存块的所有权?
使用 C99,可以这样写:
灵活长度的数组可能很有用,例如在实现具有可变大小块的内存池或在专用于线程的堆上分配内存时。仅在运行时才知道所需大小的数据结构以“原子”方式分配,其成员连续打包。
我想知道类似的 Rust 实现是否可能(没有unsafe
构造),如果是,它是什么样子的。也许编译器可能会使用struct
定义中的生命周期说明符来推断一些信息?
c - 为什么灵活数组成员的静态初始化有效?
我为菜单编写了以下基本代码:
浏览一些相关问题,似乎使用灵活数组成员的唯一方法是为其动态分配内存。但是,我的编译器非常乐意编译和运行代码而不会出现任何错误或警告。这是禁止的吗?
我正在使用 MinGW gcc 4.6.1 并在 C99 规则下编译。
c - 如何以缓存友好的方式访问灵活数组的数组?
我有records
灵活的数组成员
我有多个records
相同数量的,numbers
所以我可以将它们排列成数组。我想将它们分配到一个连续的内存空间中。
所以现在我知道record_size
并且我可以访问它但是如何通过给定的record
索引正确和安全地执行它的最佳实践是什么?
foo
当我将包含andbar
和的标头分开时,我可以做到这一点numbers
,但我想保持record
在一起以实现缓存一致性。
c - 在 C 中存储整数和通用指针的最便携方式是什么?
我正在开发一个系统(虚拟机?不知道如何调用它),其中每个数据结构都是一个数组(或结构),开头有三个整数字段(必须紧接着一个没有填充字节的开头)和n通用指针。我对此有很多想法,但似乎很难找到一个明确的解决方案。
下面是我的第一次尝试。
我不确定void *
对整数的强制转换是否安全。经过一番研究,我将代码更改如下。
但后来我发现在某些平台上sizeof(void *)
可能不相等sizeof(uintptr_t)
。所以我决定把它改成一个结构。
在这里,我发现了一个问题,即 C 中没有 100% 可移植的通用指针,但是我找不到解决方案,所以让我忽略一些具有不同指针大小的奇怪平台。
因此,鉴于 avoid *
可以存储指向任何对象的指针,我的最后一个解决方案是否满足我的目的?我对灵活的数组成员不太熟悉,所以我可能犯了一个错误。或者我可能仍然错过了一些要点。
任何帮助表示赞赏。
c - 嵌套结构中的灵活数组成员
在嵌套结构中具有灵活的数组成员是有效的 C 代码吗?那么下面的示例代码是否可以保证与理智的编译器一起按预期工作?