|

我是老温,一名热爱学习的嵌入式工程师; j4 h0 g7 R% f
关注我,一起变得更加优秀!
: r3 V- I% a8 K: B9 u3 z我们在编写 C 语言程序的时候,如果使用的编译器只支持 C89 标准,那么,在定义数组的时候,数组长度必须确定,例如:int arr[10],因为数组是静态分配内存的,所以数组的长度必须要在编译时进行确定。$ ?; H; C$ _2 i9 z8 r$ R
当然,我们也可以采用指针变量和动态内存分配的方式,来模拟动态数组的行为,可以使用 malloc 或者 calloc 相关的函数,在程序运行时进行动态内存分配。
" s1 n: Y: T0 n7 t6 B8 g- f示例代码如下:#include #include 2 [1 m1 c, m$ z; l- D' A- r' S
int main() { int *arr = NULL; int n = 10; // 动态分配数组 arr = (int *)malloc(n * sizeof(int));7 e* f, {+ H; A' h! O
if (arr == NULL)return -1; // 使用数组 for (int i = 0; i arr = i; }
' _" D6 N3 m" X% _ // 打印数组内容 for (int i = 0; i printf("%d \mn ", arr); }8 ~8 S% R: E b3 d
// 释放内存 if(NULL != arr)free(arr);
" w0 c3 i( p K% ~; ~6 A& l# O return 0;}
& N6 x$ ~& \" D+ p% \+ C1 t& ~; n然而,除了使用 malloc 来模拟实现动态数组的功能之外,在 C 语言的 C99 标准里面,还引入了可变长数组(VLA)的概念,也就是说,可以允许数组的长度在程序运行时进行确定。
- S0 r5 j/ `9 g4 K8 [ h示例代码如下: #include
* O; V( i1 ?' E2 \; q) Mint main() { int n = 0; printf("Enter the number of elements: "); scanf("%d", &n);
$ F$ n2 U$ V4 D4 E3 P2 c0 b // 创建一个VLA int arr[n];& p% B/ u( z) a3 T' f5 r6 G
// 使用VLA for (int i = 0; i arr = i * i; }
+ H4 t" c) c- ~$ ]5 h; o1 O1 ? // 打印数组内容 for (int i = 0; i printf("%d \mn", arr); }
: h% v& e1 O& ]- B# H# _' V C return 0;}0 z- m$ a! N5 j/ X0 V, g9 [! h
C99 标准里面的可变长数组特性,它允许数组在运行时才确定大小,尤其是在处理大小不确定的数据集时,可变长数组(VLA)为程序员提供了更大的灵活性。
3 L3 u8 J# m+ y7 s ^9 u; g+ V+ G; U7 D使用可变长数组(VLA)的优势:1 ^# w$ f2 L; I3 B+ b! }, w+ H
1、动态分配大小:使用可变长数组,可以根据实际需要,在程序运行时分配数组的带下,在处理不确定大小的数据集时,非常有用。3 ]& k4 S8 x- a0 U9 S! v
2、减少内存浪费:由于可变长数组是运行时才确定其大小的,因此可以避免在编译时分配固定内存,造成内存浪费。
; s. I8 q# e6 c& ]! d+ n0 z: a但是,可变长数组(VLA)这种特性有利也有弊,在使用的时候需要注意一些潜在的问题。
8 h- N2 g X# v- U* E9 f4 K( l4 Y. i' r2 D. @使用可变长数组的注意事项:2 {( a1 | ?4 x0 _; Y/ `
1、编译器兼容问题:不是所有的编译器都支持 C99 标准里面的VLA特性,并且可能需要特定的编译器标志位来启用。
9 F8 m- T0 T8 a2、程序可移植性:VLA特性在 C11 标准里面已经被进行标记,可能会在未来的 C 语言标准中移除,因此需要注意代码的可移植性。
6 X- n# D" t+ ~" s1 a4 [" b8 R- C3、栈溢出风险:VLA在程序运行时分配数组空间大小,其位于内存的栈区域,使用不当可能会导致栈溢出。& H V$ G* ?/ O& p4 [6 U: R+ u8 W
4、性能优化问题:编译器可能无法对VLA进行优化,其代码性能可能不如静态分配数组或使用malloc分配内存。
: K1 O2 m4 M; l, A总的来说,可变长数组(VLA)特性,在编译时不确定数组大小,而是在程序运行时才确定,在使用时需要权衡其优缺点,并且注意潜在的风险。在某些情况下,使用VLA特性与动态内存 malloc 分配,可能会是一个不错的选择。
o: i5 y4 p, i+ T/ ]- c-END-
4 }4 o! Z! p% P; _- ~往期推荐:点击图片即可跳转阅读6 V k' _7 i6 I* ^+ @
8 b2 f" ^( K9 w/ ~8 a
! a3 `6 t5 J4 G1 W( G9 r, B
* c$ m3 |5 ]% y4 P ( `4 v. X7 e7 P+ \, {2 C' ?
a3cfcchoivu64010763454.jpg
3 l8 u) x, m5 q/ a
4 `& s; q. j0 ~( Y1 X. q 嵌入式物联网开发,搭建属于自己的云服务器6 |& X3 ~2 ]' P2 g! E$ z! H
$ n- t0 @3 ^: @5 R( m. P3 x
9 p+ Q6 Y3 j1 u Q1 G
$ C1 D4 e5 r1 r2 f8 _ 3 K. ^: H- m a5 S m% R
xddsrwratvy64010763554.jpg
/ J# _( D# Q- g) o& W
+ [2 F0 ?3 X% _ 嵌入式处理器芯片,已经进入了高算力时代!
5 Y& C. E$ ^7 [9 l) Z+ S# T. S/ j
. N' K# }5 \! _
7 I) A7 S+ o6 Y5 Z4 D! }+ w
1 Z E ^6 O* l; l6 o7 X
fiiuztsqnfq64010763654.jpg
' Q' n5 o' g; w. F7 H & V* v% M z: h; m' u/ [5 d, T
星闪,一项迫于无奈的创新技术!3 s+ g Q- P5 _- K
, ^! F2 n; X. j7 v * ~4 G. U7 m0 D7 i5 Y
8 K* q* t- s! `6 Q& x/ F) }4 O
我是老温,一名热爱学习的嵌入式工程师; O2 n' s; }3 w3 C7 p3 H' s
关注我,一起变得更加优秀! |
|