在C中声明动态数组?

时间:2011-11-13 06:13:31

标签: c arrays data-structures

我有一个包含两个int字段的struct PACKET。我如何声明PACKET的动态数组?我将在主要内容中添加未知次数的数组...这就是为什么我需要动态调整大小。

4 个答案:

答案 0 :(得分:2)

根据您使用的环境,您有以下选项:

  1. 使用mallocrealloc
  2. 实施可调整大小的数组
  3. 使用GNOME
  4. 中的GArrayGList数据类型
  5. 切换到C ++并使用std::vector<PACKET>
  6. 切换到Java并使用ArrayList
  7. 找到另一个提供所需功能的库
  8. 标准C在其运行时库中非常有限,但许多人已经将该标准库扩展为有用。您不应该自己编写代码,除非您处于异国情调的环境中。

答案 1 :(得分:1)

让自己熟悉mallocrealloc - 这是一些示例/小教程:

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