在C中声明动态数组?

在C中声明动态数组?,c,arrays,data-structures,C,Arrays,Data Structures,我有一个包含两个int字段的struct包。如何声明数据包的动态数组?我将添加到阵列的主要未知次数…这就是为什么我需要它的动态大小 C中没有内置动态数组,您有两个选项。一种是构建某种类型的链接存储,另一种是根据需要使用静态阵列和realloc,但您必须自己管理存储。看一看,C语言中没有内置动态数组,您有两种选择。一种是构建某种类型的链接存储,另一种是根据需要使用静态阵列和realloc,但您必须自己管理存储。看一看让自己熟悉malloc和realloc——以下是一些示例/小教程: 这里有一个更

我有一个包含两个int字段的struct包。如何声明数据包的动态数组?我将添加到阵列的主要未知次数…这就是为什么我需要它的动态大小

C中没有内置动态数组,您有两个选项。一种是构建某种类型的链接存储,另一种是根据需要使用静态阵列和realloc,但您必须自己管理存储。看一看,C语言中没有内置动态数组,您有两种选择。一种是构建某种类型的链接存储,另一种是根据需要使用静态阵列和realloc,但您必须自己管理存储。看一看

让自己熟悉
malloc
realloc
——以下是一些示例/小教程:

这里有一个更详细的解释:


在处理
realloc
时,您很可能需要将阵列的实际大小和阵列的保留容量作为两个不同的值进行管理。这是出于性能原因,否则,每次添加一个元素时都必须调用
realloc
,即使只包含几百个元素的数组也会非常慢。

熟悉
malloc
realloc
-以下是一些示例/小教程:

这里有一个更详细的解释:


在处理
realloc
时,您很可能需要将阵列的实际大小和阵列的保留容量作为两个不同的值进行管理。这是出于性能原因,否则,每次向其中添加一个元素时,您都必须调用
realloc
,即使只包含几百个元素的数组也会非常慢。

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

  • 使用
    malloc
    realloc
  • 使用GNOME中的
    GArray
    GList
    数据类型
  • 切换到C++,使用<代码> STD::向量< /代码>
  • 切换到Java并使用
    ArrayList
  • 查找另一个提供所需功能的库

  • 标准C的运行时库非常有限,但许多人已经扩展了该标准库,使其变得有用。除非您身处异域环境,否则您不需要自己编写代码。

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

  • 使用
    malloc
    realloc
  • 使用GNOME中的
    GArray
    GList
    数据类型
  • 切换到C++,使用<代码> STD::向量< /代码>
  • 切换到Java并使用
    ArrayList
  • 查找另一个提供所需功能的库

  • 标准C的运行时库非常有限,但许多人已经扩展了该标准库,使其变得有用。除非您身处异域环境,否则您不需要自己编写代码。

    将动态数组实现用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;
    }
    

    如果内存空间没有问题,您可以分块进行内存分配,而不是每次添加数据包时进行分配,并加快平均添加速度。

    将动态数组实现用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;
    }
    
    如果内存空间没有问题,您可以在块中进行内存分配,而不是在每次添加数据包时进行分配,并加快平均添加速度