电子产业一站式赋能平台

PCB联盟网

搜索
查看: 391|回复: 0
收起左侧

嵌入式 C 语言知识点,动态变长数组

[复制链接]

572

主题

572

帖子

4361

积分

四级会员

Rank: 4

积分
4361
发表于 2024-7-29 17:50:00 | 显示全部楼层 |阅读模式
我是老温,一名热爱学习的嵌入式工程师" X, ~; t2 B  H3 A
关注我,一起变得更加优秀!
6 r, H, n3 ^) }" O5 Z+ K我们在编写 C 语言程序的时候,如果使用的编译器只支持 C89 标准,那么,在定义数组的时候,数组长度必须确定,例如:int arr[10],因为数组是静态分配内存的,所以数组的长度必须要在编译时进行确定。
- O, u  g- x, E5 E6 P7 D0 o  L当然,我们也可以采用指针变量和动态内存分配的方式,来模拟动态数组的行为,可以使用 malloc 或者 calloc 相关的函数,在程序运行时进行动态内存分配。8 j* V0 ?# T6 V+ x* i, ~5 a% ~
示例代码如下:
  • #include #include
    / r  n3 `" F2 p0 V9 C# aint main() {    int *arr = NULL;    int n = 10;    // 动态分配数组    arr = (int *)malloc(n * sizeof(int));
    6 p; f/ I+ g  A( ^( e+ \6 b    if (arr == NULL)return -1;    // 使用数组    for (int i = 0; i         arr = i;    }# v+ _! s& L3 T
        // 打印数组内容    for (int i = 0; i         printf("%d \mn ", arr);    }
    5 g- d# y% p+ v& `5 ~8 l    // 释放内存    if(NULL != arr)free(arr);8 y" j4 s% i, X9 X+ Q% e$ S, z. \
        return 0;}
    2 l5 n/ Y: K) J2 u$ B- L! p3 A然而,除了使用 malloc 来模拟实现动态数组的功能之外,在 C 语言的 C99 标准里面,还引入了可变长数组(VLA)的概念,也就是说,可以允许数组的长度在程序运行时进行确定。
    9 F% X- U/ r, E$ w7 ^示例代码如下:
  • #include / Q% S7 G/ C. J/ j! {; {
    int main() {    int n = 0;    printf("Enter the number of elements: ");    scanf("%d", &n);/ Y# s" W4 a$ X0 t0 E4 L
        // 创建一个VLA    int arr[n];' X2 f9 a  o6 P$ e5 c$ ?: X" X2 a
        // 使用VLA    for (int i = 0; i         arr = i * i;    }; ?. I3 D: B' @- S& G( o
        // 打印数组内容    for (int i = 0; i         printf("%d \mn", arr);    }
    : L9 K6 e% ]. b& X    return 0;}- k2 s- R6 [% I3 @9 H
    C99 标准里面的可变长数组特性,它允许数组在运行时才确定大小,尤其是在处理大小不确定的数据集时,可变长数组(VLA)为程序员提供了更大的灵活性。
    0 `3 A& N1 Z5 Z4 X7 Y! a& e使用可变长数组(VLA)的优势:4 X- d8 g# ~" ?7 u# m# X
    1、动态分配大小:使用可变长数组,可以根据实际需要,在程序运行时分配数组的带下,在处理不确定大小的数据集时,非常有用。
    ' F0 {. b+ y4 F2、减少内存浪费:由于可变长数组是运行时才确定其大小的,因此可以避免在编译时分配固定内存,造成内存浪费。
    / Z+ N9 B! N% W; s+ J但是,可变长数组(VLA)这种特性有利也有弊,在使用的时候需要注意一些潜在的问题。
      ^2 M# z9 w, C; w使用可变长数组的注意事项:: H, h! W4 W3 [- T% l
    1、编译器兼容问题:不是所有的编译器都支持 C99 标准里面的VLA特性,并且可能需要特定的编译器标志位来启用。+ x2 m  p0 H+ M, S% k7 p* ~
    2、程序可移植性:VLA特性在 C11 标准里面已经被进行标记,可能会在未来的 C 语言标准中移除,因此需要注意代码的可移植性。
    + ~6 B% K, g  J/ P& P1 B5 F3、栈溢出风险:VLA在程序运行时分配数组空间大小,其位于内存的栈区域,使用不当可能会导致栈溢出。: i: U. s9 b6 u' r) q2 s( g
    4、性能优化问题:编译器可能无法对VLA进行优化,其代码性能可能不如静态分配数组或使用malloc分配内存。
    ' H7 \# R. P( \4 W总的来说,可变长数组(VLA)特性,在编译时不确定数组大小,而是在程序运行时才确定,在使用时需要权衡其优缺点,并且注意潜在的风险。在某些情况下,使用VLA特性与动态内存 malloc 分配,可能会是一个不错的选择。4 v: F+ _  b+ t# K
    -END-0 |9 C- v& A" K4 u  L8 n
    往期推荐:点击图片即可跳转阅读
    2 G) t3 H' b3 w) }. B                                                       
    3 S( ^& _: h- x                                                               
    ' z0 D! J4 g/ X1 @                                                                        : R/ F* W' z, }$ R4 a, G6 }% ^
                                                                                    6 b8 M  O% |1 }* S" C8 ]8 y- z

    3lq3mdps5w46405234053.jpg

    3lq3mdps5w46405234053.jpg

    3 }, q' Z( D# \: l$ A                                                                                5 R$ E# t$ E, n4 H7 O6 P
                                                                                            嵌入式物联网开发,搭建属于自己的云服务器
    1 ]' p4 v9 W/ D$ G                                                        $ S1 A  ^  U3 n# J5 p
                                                                    , h7 w5 c% }; q' Q4 `  C
                                                                           
    ! M% y7 [3 U* P/ {6 G5 s                                                                               
    $ S) e9 n1 j5 v8 s

    aghrfgtfiiy6405234154.jpg

    aghrfgtfiiy6405234154.jpg
    $ I" w3 B9 ]% n4 m4 c
                                                                                   
    2 H$ X; h. R; g7 A: ~, O" D' i  [1 o                                                                                        嵌入式处理器芯片,已经进入了高算力时代!' F. W/ a: s% w' r% [
                                                                   
    $ @, u% O9 ^& e5 ?, S& B# D: s                                                                        $ N' I) B, K. a
                                                                                    9 d6 p. T+ Y* |( }" g. D

    zqgusz25kxv6405234254.jpg

    zqgusz25kxv6405234254.jpg
    ' r/ [- O+ N7 I8 l9 l; ?
                                                                                   
    , j4 I& V3 l' H8 M* f                                                                                        星闪,一项迫于无奈的创新技术!: t' n9 Z" D, C/ z/ k
                                                                                    & M1 |2 v& `: y9 C
                                                                           
    2 ~0 h/ [' l5 P' Z, f  T                                                               
    + b2 T# Q3 W5 k% ~' C                                                        我是老温,一名热爱学习的嵌入式工程师6 K. O% c3 l2 w; U$ f, X2 a
    关注我,一起变得更加优秀!
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表