簡體   English   中英

使用ANSI C的動態數組

[英]Dynamic array using ANSI C

我有一個字符數組

char *data[]= {"11", "22", "33", "44", "55"};

最后如何添加一些額外的項目? data[]="66";

我想要一個C語言中的動態數組。

謝謝

使用[]語法創建的數組不是動態的,長度是在編譯時設置的,不能更改。

更新 :實際上,C99添加了所謂的“可變長度數組”,可以在運行時獲取它們的長度。 但是,在初始化之后,它們將無法收縮或擴展,因此以下內容仍然適用。

但是,當您擁有指針時,數組將被簡單地表達:數組可以表示為指向第一個元素和長度的指針。

因此,您可以使用malloc()動態分配內存來創建新數組:

size_t array_length = 3;
int *array = malloc(array_length * sizeof *array);

if(array != NULL)
{
  array[0] = 11;
  array[1] = 22;
  array[2] = 33;
}

您不能在此處使用{}元素列表,僅在初始化使用[]語法聲明的數組時才可用。

要增加數組,可以使用realloc()函數重新分配內存並將舊值復制到以下位置:

size_t new_length = array_length + 1;
int *bigger_array = realloc(array, new_length * sizeof *bigger_array);

if(bigger_array != NULL)
{
  bigger_array[new_length - 1] = 44;
  /* We have successfully grown the allocation, remember the new address. */
  array = bigger_array;
  array_length = new_length;
}

請注意,每次調用malloc() (或realloc() )時,如果未能分配所請求的塊,它都可以返回NULL 這就是為什么需要if語句的原因。 我從您的示例中減少了初始大小,以減少所需的分配行數,從而使示例更短。

為了使上述方法更有效,典型的動態數組代碼使用兩個長度值:一個用於實際數組(當前數組中有多少個值),另一個用於內存(我們有多少空間可以存儲)。 通過使后者的值成塊增加,可以減少內存分配的總數,當然要花一些內存。

vc_vector

vc_vector* vector = vc_vector_create(0, sizeof(const char *), NULL);

vc_vector_push_back(vector, "11");
vc_vector_push_back(vector, "22");
vc_vector_push_back(vector, "33");

for (int i = 0; i < vc_vector_count(vector); ++i) {
  printf("%s ", (const char*)vc_vector_at(vector, i));
}

// output: 11 22 33

vc_vector_release(vector);

是C語言中動態數組的基於宏的解決方案,使用的語法非常好。 適用於任何數據類型。

#include <stdio.h>
#include <stdlib.h>
#include <wondermacros/array/dynamic_array.h>

int main()
{
  int* elems = NULL; /* Initialize a dynamic array. */
  W_DYNAMIC_ARRAY_PUSH(elems, 1, 2, 3, 4); /* Push some elements. */

  /* Iterate all elements. */
  W_DYNAMIC_ARRAY_FOR_EACH(int, e, elems) {
    printf("%d\n", e);
  }

  W_DYNAMIC_ARRAY_FREE(elems); /* Free the array only this way since there is a hidden header. */
}

使用Boost預處理程序庫,因此Boost庫需要在構建時存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM