最近发现用c语言处理数组很烦。
我必须经常重新分配()来增加大小。
并且没有像C++中的vector或java中的Arraylist这样的标准数据结构
我知道在linux内核中,有一些数据结构,例如
kfifo,我们可以通过kfifo_in(),kfifo_out()函数来使用它。
但这意味着用户将定义 kfifo *pointer; 记录数组,并且该变量不包含有关结构中包含的类型的任何信息。
用户必须记住,当他尝试通过 kfifo 指针使用动态数组时。
我认为这可能有点令人困惑。
有没有更好的方法来处理这个问题?linux c编程中常见的解决方案是什么?
问问题
1663 次
3 回答
3
realloc
没那么糟糕,只要你不把它分散到你的代码中,并使用合理的策略来增长你的动态数组。
在 C 中滚动您自己的动态数组是实现一些简单函数的问题。许多简短的文章将引导您完成此练习 -这是一个示例。这篇文章定义了一个struct
代表你的动态数组,以及当前使用的和分配的大小。它还提供了用于初始化、增长和取消分配由结构表示的数组的函数。库中没有显式的初始化函数 - 您通过NULL
作为第一个参数传递来进行初始化。这是一种有效的方法,但您也可以选择更传统的init
和分隔grow
。
于 2012-06-28T17:08:12.233 回答
2
我会使用Glib 数组。它是 Linux 和其他操作系统中非常知名的库,用于 Gnome 等项目。
C 中的动态数组没有标准。
于 2012-06-28T17:10:32.730 回答
0
@蓝色的海
我的意思是他们可以定义 struct array{int len; 容量;诠释每个元素大小;void *data;} 并复制元素的字节,放在数据的末尾。– 蓝海 6 月 29 日 3:04
这已经在讨论中的库中处理了。查看它附带的宏以及 main.c 文件中的示例。根据使用的宏,您最终会得到一个指向原始数据的指针数组,或者一个指向数据副本的指针数组。
FWIW,我是该库的作者,我将是第一个承认它没有安全气囊的人,所以你必须确保安全地使用它(就像 C 中的其他任何东西一样)。
于 2012-08-15T11:35:34.357 回答