|
我是老温,一名热爱学习的嵌入式工程师
$ S0 A6 K9 I5 _1 T e- e/ Z关注我,一起变得更加优秀!
0 }0 U E: \$ f我们在编写 C 语言程序的时候,如果使用的编译器只支持 C89 标准,那么,在定义数组的时候,数组长度必须确定,例如:int arr[10],因为数组是静态分配内存的,所以数组的长度必须要在编译时进行确定。3 w. D' a& Y& }+ o* \+ J
当然,我们也可以采用指针变量和动态内存分配的方式,来模拟动态数组的行为,可以使用 malloc 或者 calloc 相关的函数,在程序运行时进行动态内存分配。
7 s: h" }6 I o! U& Q+ V. u示例代码如下:#include #include
( H* i- `' g+ W8 R2 S+ tint main() { int *arr = NULL; int n = 10; // 动态分配数组 arr = (int *)malloc(n * sizeof(int));
! s" s3 l+ K" |3 F7 D0 d5 j if (arr == NULL)return -1; // 使用数组 for (int i = 0; i arr = i; }% K/ ~* m* C0 Y; c. G& t6 }
// 打印数组内容 for (int i = 0; i printf("%d \mn ", arr); }
! B# G) T. M0 d* l // 释放内存 if(NULL != arr)free(arr);% h. L; a: U$ L, q6 a$ E
return 0;}; E; \# F4 i& s9 v+ {3 R" s
然而,除了使用 malloc 来模拟实现动态数组的功能之外,在 C 语言的 C99 标准里面,还引入了可变长数组(VLA)的概念,也就是说,可以允许数组的长度在程序运行时进行确定。4 f7 B, R3 Z1 i b+ _; F
示例代码如下: #include
7 E& B8 C5 t2 S9 {4 R4 Uint main() { int n = 0; printf("Enter the number of elements: "); scanf("%d", &n);. |0 }" E6 D/ O, x) E- @3 @
// 创建一个VLA int arr[n];9 W2 N$ x+ e" `6 F$ l. l
// 使用VLA for (int i = 0; i arr = i * i; }/ _0 B$ `' @$ O/ Q
// 打印数组内容 for (int i = 0; i printf("%d \mn", arr); }
8 ?( b' r1 G5 _% C; m/ B return 0;}
" I& K/ Z8 u3 i# xC99 标准里面的可变长数组特性,它允许数组在运行时才确定大小,尤其是在处理大小不确定的数据集时,可变长数组(VLA)为程序员提供了更大的灵活性。+ u! J" G6 F7 y
使用可变长数组(VLA)的优势:
) x: N* H" o- a3 h- J7 ]9 |1、动态分配大小:使用可变长数组,可以根据实际需要,在程序运行时分配数组的带下,在处理不确定大小的数据集时,非常有用。. ^ I n+ v8 @) k- K" g) ^
2、减少内存浪费:由于可变长数组是运行时才确定其大小的,因此可以避免在编译时分配固定内存,造成内存浪费。
, z5 q+ ~' ?& ^( w# z5 i) [# P但是,可变长数组(VLA)这种特性有利也有弊,在使用的时候需要注意一些潜在的问题。
7 @. \# \( t/ ]* |% @2 `6 G使用可变长数组的注意事项:
# M; X+ y; w* i2 D/ x/ ]1、编译器兼容问题:不是所有的编译器都支持 C99 标准里面的VLA特性,并且可能需要特定的编译器标志位来启用。7 s1 I' P* b/ a( b0 b
2、程序可移植性:VLA特性在 C11 标准里面已经被进行标记,可能会在未来的 C 语言标准中移除,因此需要注意代码的可移植性。0 l' x2 t" D3 I
3、栈溢出风险:VLA在程序运行时分配数组空间大小,其位于内存的栈区域,使用不当可能会导致栈溢出。
: S1 m1 C3 Q5 _9 N4 r4、性能优化问题:编译器可能无法对VLA进行优化,其代码性能可能不如静态分配数组或使用malloc分配内存。
2 N! L3 d+ L, g( ~2 y1 P总的来说,可变长数组(VLA)特性,在编译时不确定数组大小,而是在程序运行时才确定,在使用时需要权衡其优缺点,并且注意潜在的风险。在某些情况下,使用VLA特性与动态内存 malloc 分配,可能会是一个不错的选择。0 |2 f6 S+ X% z7 v6 e
-END-, x" A6 x" y5 }7 Z. B; i
往期推荐:点击图片即可跳转阅读
, F/ E7 q3 O: ?' |- r) \( s$ C 2 a" H! H! v; {+ s
" d. C; z! x$ c5 X+ h9 [
$ w- ], E7 m. `4 ?! Q& N+ } # Z3 g) [3 K' |" Y6 _* }* Y
rpswaoqadbp6403570340.jpg
* F, M& E, V1 U
! x6 N w1 r3 N) l4 S2 A7 P: O 嵌入式物联网开发,搭建属于自己的云服务器& V$ q" z6 A/ |5 h( L6 H3 h
3 T* P9 |1 L6 x$ f 7 @( w( k2 L$ p
/ F1 H/ g, b+ M+ i+ ^1 Q
! w2 e% j5 p* F2 j* E0 k' O* b+ N
rkhu24ydzsu6403570440.jpg
2 o8 D( O6 ^) ?6 d
! \, w. t1 R6 v" }$ Z( @( g 嵌入式处理器芯片,已经进入了高算力时代!
+ I; L, [& z: e 8 L; p3 @% [' R) P" Q" ?6 B
) K3 w/ N5 q$ }4 {6 d# m0 @7 y
( z8 V/ {0 R% I; K" Z( ]! ` n$ D
pruo4borkxl6403570540.jpg
7 m5 P5 Q* D& D( m7 a. n" Z 9 x6 z; X* v5 i9 W3 h9 `: e! n9 }
星闪,一项迫于无奈的创新技术!7 q" h: g, v! O/ h! r
0 J/ i! T% {% F ' ^0 t$ d; e+ W+ u8 F, j1 d/ K' z$ f
* W, O! W b8 T r 我是老温,一名热爱学习的嵌入式工程师, `8 |) T$ P5 h$ }5 f, \+ ^- l
关注我,一起变得更加优秀! |
|