我有一个包含两个int字段的struct PACKET。我如何声明PACKET的动态数组?我将在主要内容中添加未知次数的数组...这就是为什么我需要动态调整大小。
答案 0 :(得分:2)
根据您使用的环境,您有以下选项:
malloc
和realloc
GArray
或GList
数据类型
std::vector<PACKET>
ArrayList
标准C在其运行时库中非常有限,但许多人已经将该标准库扩展为有用。您不应该自己编写代码,除非您处于异国情调的环境中。
答案 1 :(得分:1)
让自己熟悉malloc
和realloc
- 这是一些示例/小教程:
http://fydo.net/gamedev/dynamic-arrays
这是一个更详细的解释:
http://www.cse.unt.edu/~donr/courses/4410/dynamicArrays/dynamicArrays.html
在处理realloc
时,您很可能必须将数组的实际大小和数组的保留容量作为两个不同的值进行管理。这是出于性能原因,否则,每次向其中添加一个元素时都需要调用realloc
,即使对于只包含几百个元素的数组也会非常慢。
答案 2 :(得分:1)
使用malloc / realloc将动态数组实现封装在.h / .c文件对中以便于使用。
static int length = 0;
PACKET *dynamic_array_put(PACKET *list, const PACKET new) {
PACKET *ret_val = NULL;
ret_val = realloc(list, sizeof(PACKET) * (length + 1));
if (ret_val == NULL) {
/* Not enough memory */
return NULL;
}
memmove(list + length, &new, sizeof(PACKET));
length++;
return ret_val;
}
PACKET *dynamic_array_get(PACKET *list, int index) {
PACKET *p = NULL;
p = malloc(sizeof(PACKET));
if (p == NULL) {
/* Not enough memory */
return NULL;
}
memmove(p, list + index, sizeof(PACKET));
return p;
}
PACKET *dynamic_array_remove(PACKET *list, int index) {
PACKET *ret_val = NULL;
PACKET tmp;
memmove(&tmp, list + index, sizeof(PACKET));
memmove(list + index, list + index + 1,
sizeof(PACKET) * (list - index - 1));
ret_val = realloc(list, sizeof(PACKET) * (list - 1));
if (ret_val == NULL) {
/* Not enough memory, restore! */
memmove(list + index + 1, list + index,
sizeof(PACKET) * (list - index - 1));
memmove(list + index, &tmp, sizeof(PACKET));
return NULL;
}
length--;
return ret_val;
}
如果内存空间没有问题,你可以在块中进行内存分配,而不是每增加一个PACKET,都可以加快平均值。
答案 3 :(得分:0)
C中没有内置动态数组,你有几个选项。一个构建某种类型的链接存储,另一个是根据需要使用静态数组和realloc,但是你必须自己管理存储。拿一个looke realloc