加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

嵌入式 C 語言知識(shí)點(diǎn),動(dòng)態(tài)變長(zhǎng)數(shù)組

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

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

我們?cè)诰帉?C 語言程序的時(shí)候,如果使用的編譯器只支持 C89 標(biāo)準(zhǔn),那么,在定義數(shù)組的時(shí)候,數(shù)組長(zhǎng)度必須確定,例如:int arr[10],因?yàn)閿?shù)組是靜態(tài)分配內(nèi)存的,所以數(shù)組的長(zhǎng)度必須要在編譯時(shí)進(jìn)行確定。

當(dāng)然,我們也可以采用指針變量和動(dòng)態(tài)內(nèi)存分配的方式,來模擬動(dòng)態(tài)數(shù)組的行為,可以使用 malloc 或者 calloc 相關(guān)的函數(shù),在程序運(yùn)行時(shí)進(jìn)行動(dòng)態(tài)內(nèi)存分配。

示例代碼如下:

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

然而,除了使用 malloc 來模擬實(shí)現(xiàn)動(dòng)態(tài)數(shù)組的功能之外,在 C 語言的 C99 標(biāo)準(zhǔn)里面,還引入了可變長(zhǎng)數(shù)組(VLA)的概念,也就是說,可以允許數(shù)組的長(zhǎng)度在程序運(yùn)行時(shí)進(jìn)行確定。

示例代碼如下:

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

C99 標(biāo)準(zhǔn)里面的可變長(zhǎng)數(shù)組特性,它允許數(shù)組在運(yùn)行時(shí)才確定大小,尤其是在處理大小不確定的數(shù)據(jù)集時(shí),可變長(zhǎng)數(shù)組(VLA)為程序員提供了更大的靈活性。

使用可變長(zhǎng)數(shù)組(VLA)的優(yōu)勢(shì):

1、動(dòng)態(tài)分配大?。?/strong>使用可變長(zhǎng)數(shù)組,可以根據(jù)實(shí)際需要,在程序運(yùn)行時(shí)分配數(shù)組的帶下,在處理不確定大小的數(shù)據(jù)集時(shí),非常有用。

2、減少內(nèi)存浪費(fèi):由于可變長(zhǎng)數(shù)組是運(yùn)行時(shí)才確定其大小的,因此可以避免在編譯時(shí)分配固定內(nèi)存,造成內(nèi)存浪費(fèi)。

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

使用可變長(zhǎng)數(shù)組的注意事項(xiàng):

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

2、程序可移植性:VLA特性在 C11 標(biāo)準(zhǔn)里面已經(jīng)被進(jìn)行標(biāo)記,可能會(huì)在未來的 C 語言標(biāo)準(zhǔn)中移除,因此需要注意代碼的可移植性。

3、棧溢出風(fēng)險(xiǎn):VLA在程序運(yùn)行時(shí)分配數(shù)組空間大小,其位于內(nèi)存的棧區(qū)域,使用不當(dāng)可能會(huì)導(dǎo)致棧溢出。

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

總的來說,可變長(zhǎng)數(shù)組(VLA)特性,在編譯時(shí)不確定數(shù)組大小,而是在程序運(yùn)行時(shí)才確定,在使用時(shí)需要權(quán)衡其優(yōu)缺點(diǎn),并且注意潛在的風(fēng)險(xiǎn)。在某些情況下,使用VLA特性與動(dòng)態(tài)內(nèi)存 malloc 分配,可能會(huì)是一個(gè)不錯(cuò)的選擇。

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
LAN8710AI-EZK-TR 1 Microchip Technology Inc DATACOM, ETHERNET TRANSCEIVER, QCC32, 5 X 5 MM, 0.90 MM HEIGHT, ROHS COMPLIANT, QFN-32

ECAD模型

下載ECAD模型
$1.56 查看
TJA1040T/CM,118 1 NXP Semiconductors TJA1040 - High-speed CAN transceiver with standby mode SOIC 8-Pin

ECAD模型

下載ECAD模型
$2.24 查看
VOD217T 1 Vishay Intertechnologies VOD205T, VOD206T, VOD207T, VOD211T, VOD213T, VOD217T Optocoupler, Phototransistor Output, Dual Channel, SOIC-8 Package

ECAD模型

下載ECAD模型
$0.76 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜