电子产业一站式赋能平台

PCB联盟网

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

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

[复制链接]

572

主题

572

帖子

4361

积分

四级会员

Rank: 4

积分
4361
发表于 2024-7-29 17:50:00 | 显示全部楼层 |阅读模式
我是老温,一名热爱学习的嵌入式工程师
. S  |* K  R3 }* p2 L1 B# f关注我,一起变得更加优秀!
: W' S- c% F$ m- Y3 v7 [( D+ ~; l* J我们在编写 C 语言程序的时候,如果使用的编译器只支持 C89 标准,那么,在定义数组的时候,数组长度必须确定,例如:int arr[10],因为数组是静态分配内存的,所以数组的长度必须要在编译时进行确定。
- Y; Y% q' z6 |# F: s. J' f当然,我们也可以采用指针变量和动态内存分配的方式,来模拟动态数组的行为,可以使用 malloc 或者 calloc 相关的函数,在程序运行时进行动态内存分配。3 D9 ~9 i; ^- T  Y5 I$ h3 H
示例代码如下:
  • #include #include
    7 ^- h' N; R' G2 U! C% ~int main() {    int *arr = NULL;    int n = 10;    // 动态分配数组    arr = (int *)malloc(n * sizeof(int));
    - c& w- S8 w! x& O. T1 B2 m4 {    if (arr == NULL)return -1;    // 使用数组    for (int i = 0; i         arr = i;    }
    3 O- \: H% A1 u2 V% b    // 打印数组内容    for (int i = 0; i         printf("%d \mn ", arr);    }
    , a& g) r3 L/ G7 Z; j. u: g    // 释放内存    if(NULL != arr)free(arr);4 x- h  P% u9 g2 N2 {& U) U# n. c
        return 0;}' T/ r8 X9 ~! F
    然而,除了使用 malloc 来模拟实现动态数组的功能之外,在 C 语言的 C99 标准里面,还引入了可变长数组(VLA)的概念,也就是说,可以允许数组的长度在程序运行时进行确定。
    . h9 Z* G9 n2 V6 m1 [; ?示例代码如下:
  • #include
    8 c* u! u" j" _: b/ d' Bint main() {    int n = 0;    printf("Enter the number of elements: ");    scanf("%d", &n);4 X# [! X" X* R' N& W2 }2 ^
        // 创建一个VLA    int arr[n];
    * {4 R4 A; a/ b5 a, G    // 使用VLA    for (int i = 0; i         arr = i * i;    }
    * C% M# C) t  F& U$ |0 u    // 打印数组内容    for (int i = 0; i         printf("%d \mn", arr);    }! m+ o$ V) {, J
        return 0;}1 I9 L+ a  U2 i0 |3 M
    C99 标准里面的可变长数组特性,它允许数组在运行时才确定大小,尤其是在处理大小不确定的数据集时,可变长数组(VLA)为程序员提供了更大的灵活性。
    7 ?, \7 [* H( C$ X使用可变长数组(VLA)的优势:
    2 v- v7 T8 W6 H/ j1、动态分配大小:使用可变长数组,可以根据实际需要,在程序运行时分配数组的带下,在处理不确定大小的数据集时,非常有用。
    4 f0 d8 E) j" K& h( u2、减少内存浪费:由于可变长数组是运行时才确定其大小的,因此可以避免在编译时分配固定内存,造成内存浪费。0 j3 Z( z5 V" o1 ^/ N+ v1 F- K. h
    但是,可变长数组(VLA)这种特性有利也有弊,在使用的时候需要注意一些潜在的问题。
    3 U0 I( x2 ]' \% Z, T0 f+ R6 G' w8 s使用可变长数组的注意事项:3 S5 I7 S& q) }6 N/ }
    1、编译器兼容问题:不是所有的编译器都支持 C99 标准里面的VLA特性,并且可能需要特定的编译器标志位来启用。) E/ x/ O5 w$ h! w5 G+ F( v5 a
    2、程序可移植性:VLA特性在 C11 标准里面已经被进行标记,可能会在未来的 C 语言标准中移除,因此需要注意代码的可移植性。
    ( o! E& \$ y8 K9 t: K, o* Y3、栈溢出风险:VLA在程序运行时分配数组空间大小,其位于内存的栈区域,使用不当可能会导致栈溢出。- q# c; F. u8 [# A2 q! I3 |7 D
    4、性能优化问题:编译器可能无法对VLA进行优化,其代码性能可能不如静态分配数组或使用malloc分配内存。
    ' U) I6 c- l( V# x( u) A总的来说,可变长数组(VLA)特性,在编译时不确定数组大小,而是在程序运行时才确定,在使用时需要权衡其优缺点,并且注意潜在的风险。在某些情况下,使用VLA特性与动态内存 malloc 分配,可能会是一个不错的选择。8 ?# I( |0 X6 K: e
    -END-9 b8 ~& ]6 j5 b* B5 ~: c
    往期推荐:点击图片即可跳转阅读, o" i9 Q+ T9 y9 ?4 f
                                                            % }# s1 H: ]( p6 R: P
                                                                    . p0 E9 q+ v; Q/ H/ W! u$ C# I
                                                                            % r6 V% P" k: z5 M2 ~8 i0 s1 w
                                                                                   
    $ M% s7 \  u3 T

    eo3y5hvdzjc64016696037.jpg

    eo3y5hvdzjc64016696037.jpg
    ; H) O& b$ s5 b
                                                                                    & Z5 W) R9 F. J5 Q. M
                                                                                            嵌入式物联网开发,搭建属于自己的云服务器$ l7 \, n5 e# J9 k, d5 f3 V% p
                                                           
    : V' e: r, b1 r                                                                " w$ q8 q+ b. U+ O4 K+ M4 e8 H
                                                                            8 ~  U' \" ?+ M! u2 O
                                                                                   
    # x4 t- o3 ~' Y& ~% L7 U

    tq3m3azzu2b64016696137.jpg

    tq3m3azzu2b64016696137.jpg

    # n( K" X6 H7 [  H0 R7 U! {                                                                                0 d9 y, @/ w3 d" h' {
                                                                                            嵌入式处理器芯片,已经进入了高算力时代!+ O! U" u( ~- k" z$ U
                                                                    6 w. ?8 H& ^  o; `
                                                                              m2 J: ?) S& h( \7 o/ N9 m  _- R
                                                                                    7 \" F9 X7 @7 _6 E8 f

    k4hlcq40oct64016696237.jpg

    k4hlcq40oct64016696237.jpg

    7 X' {7 @; [, M# K                                                                                5 x9 ?# e3 e/ a+ O
                                                                                            星闪,一项迫于无奈的创新技术!
    7 P0 p  v$ @* R" F! w0 j5 Q2 [  A                                                                                8 U/ _( a6 T! E4 s
                                                                           
      z0 t+ F- _; @                                                                5 K# V% F! Y2 }9 b, C
                                                            我是老温,一名热爱学习的嵌入式工程师
    ; S3 u+ c0 h: W1 p! d' ]2 L关注我,一起变得更加优秀!
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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