问题标签 [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++ - 如何在 C++ 中处理灵活的数组
语境
所以我一直在玩 C/C++ 中的数组,试图创建可以动态添加和删除元素的数组。
当然,我认为 C 中灵活的数组成员特性是合适的选择。所以我开始试验,如下面的代码所示:
这样做的目的是让我了解(可能)如何vector
工作以及与之相关的挑战。
问题
我只知道向数组中添加元素,但即便如此,当我编译和运行代码时,程序在退出之前结束时会出现巨大的延迟(我认为这是因为内存泄漏)。
问题
所以,问题是:我想通过询问如何构建动态数组来断言我在创建动态数组时遵循正确的路径,这些动态数组可以根据请求推送和弹出。
如何正确构建动态数组?或者
如何建立自己的 vector
结构?或者
是否有任何好的资源/ PDF 可以教授动态数组(或's)是如何制作的? vector
c - 单个 malloc 中的多个结构调用未定义的行为?
从在声明灵活数组成员时使用正确的语法它说,当被黑客入侵时,何时malloc
用于标题和灵活数据,data[1]
struct
此示例在访问数据数组的第一个元素以外的任何元素时具有未定义的行为。(参见 C 标准,6.5.6。)因此,编译器可以生成在访问数据的第二个元素时不返回预期值的代码。
我查阅了 C 标准 6.5.6,看不出这将如何产生未定义的行为。我使用了一种我很熟悉的模式,其中标题隐含地跟随数据,使用相同的malloc
,
印刷,
兼容的解决方案使用C99
灵活的数组成员。该页面还说,
在声明灵活数组成员时未能使用正确的语法可能会导致未定义的行为,尽管错误的语法适用于大多数实现。
从技术上讲,这段C90
代码是否也会产生未定义的行为?如果不是,有什么区别?(或者 Carnegie Mellon Wiki 不正确?)在实现上这不起作用的因素是什么?
c - 如何在 C 中推送和弹出 void 指针
我有这个工作代码:
它输出:
它应该输出这个:
作为 CI 新手,我并不确定发生了什么或为什么输出会像那样“损坏”。虽然双指针似乎允许您在不知道类型void**
的情况下传入一个指针并取出一个值,所以是的。但是想知道是否可以展示应该如何实现此代码,以便我可以了解如何做这样的事情。
用clang编译:
更新
我已经更新了我的代码以反映最新的答案,但仍然不确定集合的 malloc 是否正确。
c - 如何统一分配具有灵活数组成员的结构数组?
我有以下带有灵活数组成员的结构:
现在我想分配一些内存来连续放置这个结构(比如在数组中)。问题是一个声明,比如struct test test_arr[]
未定义的行为。6.7.2.1(p3)
:
具有多个命名成员的结构的最后一个成员可能具有不完整的数组类型;这样的结构(以及任何可能递归地包含此类结构的成员的联合)不应是结构的成员或数组的元素。
我们知道,返回的指针malloc
可以转换为指向任何具有基本对齐方式的对象类型的指针。考虑以下代码:
这样做的合规方式是什么?
c - 将内存复制到灵活数组成员
我正在尝试为具有灵活数组成员的结构编写分配函数。我实现它如下:
我不确定的是将堆栈可变长度数组的内存复制到灵活数组成员。我这样做是为了避免在返回时处理free
结构。ns_request_character
-1
c - 更新结构中的变量值会导致同一结构中的另一个变量被修改
我正在研究一个代码,它随着时间的推移处理十字路口的交通并返回给定时间十字路口的交通量。
基本上我遇到的问题是一个结构数组,其中每个结构包含 2 个向量:一个具有交叉口的坐标 (x, y),另一个跟踪在时间 t 进入该交叉口的汽车数量(每个插槽从 0 到n代表时间,里面的值是当时通过的汽车数量)。
这是结构:
它包含在此结构的交集数组中:
然后使用 malloc 分配内存,以在读取所需数据时定义灵活数组的实际数组大小:
在读取有关汽车从一个位置到另一个位置的行程的数据时,如前所述,我所做的是,当汽车当时穿过那个十字路口时,将 timeslots[t] 增加一。
问题是,当我使用包含在 while 循环中的这行代码这样做时
坐标数组中的值被修改。
这是一个在每个循环中仅打印出交叉点坐标的示例:
(i 是访问位置 i 中的 intersections[] 的循环的计数器,而 h 和 v 是 coords[] 数组中包含的交叉点 i 的水平和垂直坐标)
正如您所注意到的,即使我什至没有使用递增函数访问该数组,某些交叉点的坐标也会在每个周期后进行修改
这是导致此问题的原因。这怎么可能?会不会是内存分配问题?
c - 将灵活数组更改为指针
我正在努力消除我的 C 代码中出现的 MISRA 违规。它违反了规则 18.7。
在这里,第 1 行导致了 MISRA 违规。
我试图将其转换为:
我们可以像上面那样做还是违反了什么?
c - 未命名结构的灵活数组成员
考虑以下示例:
我预计这个程序会崩溃,但它运行得很好。如指定6.5.3.4(p2)
:
运算符产生其
sizeof
操作数的大小(以字节为单位),它可以是表达式或带括号的类型名称。大小由操作数的类型决定。结果是一个整数。如果操作数的类型是变长数组类型,则计算操作数;否则,不计算操作数,结果为整数常量
的操作数的类型sizeof ((*((tfa*) NULL)).info)[sz]
是可变长度数组,因此应评估操作数。但是对操作数的评估意味着取消引用NULL
,我预计会导致崩溃。
代码的行为是否定义良好?
c - 强制转换可以比标记的联合更高效吗?
我正在设计一个经典的虚拟机,它将在某种通用的、类型切换的值上运行——现在用一个标记的联合表示:
我在网上找到了很多关于此的文献,并得出结论认为这是解决该问题的一种非常正统的方法。不过,我想知道是否可以通过以下方法提高性能:
在这里,我的推理是,在访问原始类型的额外间接成本(以及需要执行单独的分配 - 可能通过池化帮助)与保存在集合中的内存(例如val_vec
,减半)之间进行权衡它表示的当前胖指针的大小。我知道这里的简单答案将是“衡量它”,但我无法提出一个具有充分代表性的模型,该模型本身并不是一个完整的实现。
是否有第二种方法的名称,并且 - 假设这将被仔细管理(但不假设它不会导致未定义的行为)是否存在我没有考虑到的广泛理解的风险?这里最好采用哪种方法?
顺便说一句,是否也可以类似地使用灵活的数组成员?
c - sizeof() 具有零长度数组成员的结构
我对sizeof()
C 中的输出感到困惑。假设我有:
我希望sizeof(struct foo)
是 4。但是,它在使用 gcc 编译后返回 3。此外,在使用严格设置编译代码时-pedantic-errors
,我得到编译器错误。
有人可以帮我理解这种行为吗?