加入星計劃,您可以享受以下權益:

  • 創(chuàng)作內容快速變現
  • 行業(yè)影響力擴散
  • 作品版權保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關推薦
  • 電子產業(yè)圖譜
申請入駐 產業(yè)圖譜

嵌入式 C 語言知識點,動態(tài)變長數組

07/30 09:35
1172
閱讀需 5 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

我是老溫,一名熱愛學習的嵌入式工程師關注我,一起變得更加優(yōu)秀!

我們在編寫 C 語言程序的時候,如果使用的編譯器只支持 C89 標準,那么,在定義數組的時候,數組長度必須確定,例如:int arr[10],因為數組是靜態(tài)分配內存的,所以數組的長度必須要在編譯時進行確定。

當然,我們也可以采用指針變量和動態(tài)內存分配的方式,來模擬動態(tài)數組的行為,可以使用 malloc 或者 calloc 相關的函數,在程序運行時進行動態(tài)內存分配。

示例代碼如下:

#include?<stdio.h>#include <stdlib.h>
int main() {????int?*arr?=?NULL;    int n = 10;    // 動態(tài)分配數組    arr = (int *)malloc(n * sizeof(int));
    if (arr == NULL)return -1;    // 使用數組    for (int i = 0; i < n; i++) {        arr[i] = i;    }
    // 打印數組內容    for (int i = 0; i < n; i++) {        printf("%d mn ", arr[i]);    }
    // 釋放內存    if(NULL != arr)free(arr);
    return 0;}

然而,除了使用 malloc 來模擬實現動態(tài)數組的功能之外,在 C 語言的 C99 標準里面,還引入了可變長數組(VLA)的概念,也就是說,可以允許數組的長度在程序運行時進行確定。

示例代碼如下:

#include <stdio.h>
int main() {????int?n?=?0;    printf("Enter the number of elements: ");    scanf("%d", &n);
    // 創(chuàng)建一個VLA    int arr[n];
    // 使用VLA    for (int i = 0; i < n; i++) {        arr[i] = i * i;    }
    // 打印數組內容    for (int i = 0; i < n; i++) {????????printf("%d?mn",?arr[i]);    }
    return 0;}

C99 標準里面的可變長數組特性,它允許數組在運行時才確定大小,尤其是在處理大小不確定的數據集時,可變長數組(VLA)為程序員提供了更大的靈活性。

使用可變長數組(VLA)的優(yōu)勢:

1、動態(tài)分配大小:使用可變長數組,可以根據實際需要,在程序運行時分配數組的帶下,在處理不確定大小的數據集時,非常有用。

2、減少內存浪費:由于可變長數組是運行時才確定其大小的,因此可以避免在編譯時分配固定內存,造成內存浪費。

但是,可變長數組(VLA)這種特性有利也有弊,在使用的時候需要注意一些潛在的問題。

使用可變長數組的注意事項:

1、編譯器兼容問題:不是所有的編譯器都支持 C99 標準里面的VLA特性,并且可能需要特定的編譯器標志位來啟用。

2、程序可移植性:VLA特性在 C11 標準里面已經被進行標記,可能會在未來的 C 語言標準中移除,因此需要注意代碼的可移植性。

3、棧溢出風險:VLA在程序運行時分配數組空間大小,其位于內存的棧區(qū)域,使用不當可能會導致棧溢出。

4、性能優(yōu)化問題:編譯器可能無法對VLA進行優(yōu)化,其代碼性能可能不如靜態(tài)分配數組或使用malloc分配內存。

總的來說,可變長數組(VLA)特性,在編譯時不確定數組大小,而是在程序運行時才確定,在使用時需要權衡其優(yōu)缺點,并且注意潛在的風險。在某些情況下,使用VLA特性與動態(tài)內存 malloc 分配,可能會是一個不錯的選擇。

推薦器件

更多器件
器件型號 數量 器件廠商 器件描述 數據手冊 ECAD模型 風險等級 參考價格 更多信息
XRCGB25M000F3A00R0 1 Murata Manufacturing Co Ltd Parallel - Fundamental Quartz Crystal, 25MHz Nom, ROHS AND REACH COMPLIANT, SMALL, SMD, 3 PIN

ECAD模型

下載ECAD模型
$0.34 查看
M25P05-AVMN6P 1 Rochester Electronics LLC 64KX8 FLASH 2.7V PROM, PDSO8, 0.150 INCH, ROHS COMPLIANT, PLASTIC, SOP-8
$0.79 查看
S29GL256P10FFI020 1 AMD Flash, 16MX16, 100ns, PBGA64,
$9.29 查看

相關推薦

電子產業(yè)圖譜