|
我是老温,一名热爱学习的嵌入式工程师
$ e# l2 x8 H# X' e4 i+ A* m关注我,一起变得更加优秀!' T+ U2 }( ~# i2 t
我们在编写 C 语言程序的时候,如果使用的编译器只支持 C89 标准,那么,在定义数组的时候,数组长度必须确定,例如:int arr[10],因为数组是静态分配内存的,所以数组的长度必须要在编译时进行确定。
, O7 Y' f7 A) B8 i& r1 I当然,我们也可以采用指针变量和动态内存分配的方式,来模拟动态数组的行为,可以使用 malloc 或者 calloc 相关的函数,在程序运行时进行动态内存分配。2 G6 O* o3 ]( e$ o
示例代码如下:#include #include
: L) V# H. f1 I; O9 B% |! U; Jint main() { int *arr = NULL; int n = 10; // 动态分配数组 arr = (int *)malloc(n * sizeof(int));
/ E0 R6 E& T( _1 n3 q9 [ if (arr == NULL)return -1; // 使用数组 for (int i = 0; i arr = i; }: F; ?( k1 [+ e4 e* f; R% H: W
// 打印数组内容 for (int i = 0; i printf("%d \mn ", arr); }% V a5 d( f# u
// 释放内存 if(NULL != arr)free(arr);$ q8 p9 [& K# P4 i) f" F3 o
return 0;}4 e6 d4 }# K. w/ y, S5 I( T
然而,除了使用 malloc 来模拟实现动态数组的功能之外,在 C 语言的 C99 标准里面,还引入了可变长数组(VLA)的概念,也就是说,可以允许数组的长度在程序运行时进行确定。7 ]5 p1 a' z7 }! A' P, B7 _: M
示例代码如下: #include
! [+ w3 c) e1 s" c5 G, K6 X; jint main() { int n = 0; printf("Enter the number of elements: "); scanf("%d", &n);; Z, {) u' @' U+ r/ u2 u( T
// 创建一个VLA int arr[n];
0 t. W( G+ y. V // 使用VLA for (int i = 0; i arr = i * i; }
" D* Y! p5 `! u/ b4 f$ o8 j // 打印数组内容 for (int i = 0; i printf("%d \mn", arr); } D9 x; X2 u7 W' y! B& k
return 0;}
$ l4 l/ G+ J! E/ Q% L* e# V% ?C99 标准里面的可变长数组特性,它允许数组在运行时才确定大小,尤其是在处理大小不确定的数据集时,可变长数组(VLA)为程序员提供了更大的灵活性。
9 l. b" ^/ m4 Y/ A使用可变长数组(VLA)的优势:5 g) m; {: y( H- \8 j) J% L
1、动态分配大小:使用可变长数组,可以根据实际需要,在程序运行时分配数组的带下,在处理不确定大小的数据集时,非常有用。
6 Y2 h3 o* o% t- Z2、减少内存浪费:由于可变长数组是运行时才确定其大小的,因此可以避免在编译时分配固定内存,造成内存浪费。
" R; N z0 Q: F: k) C! O0 a但是,可变长数组(VLA)这种特性有利也有弊,在使用的时候需要注意一些潜在的问题。) }" y5 d* D* V, P
使用可变长数组的注意事项:
; e" n2 g% F- w9 c1、编译器兼容问题:不是所有的编译器都支持 C99 标准里面的VLA特性,并且可能需要特定的编译器标志位来启用。5 R! b4 j( E6 A$ f" u$ p
2、程序可移植性:VLA特性在 C11 标准里面已经被进行标记,可能会在未来的 C 语言标准中移除,因此需要注意代码的可移植性。; ^( V0 t5 D0 v9 ~
3、栈溢出风险:VLA在程序运行时分配数组空间大小,其位于内存的栈区域,使用不当可能会导致栈溢出。
) \2 S" b3 P1 y& s" P3 [8 Z4、性能优化问题:编译器可能无法对VLA进行优化,其代码性能可能不如静态分配数组或使用malloc分配内存。
. |3 A# H4 l' o6 K" `总的来说,可变长数组(VLA)特性,在编译时不确定数组大小,而是在程序运行时才确定,在使用时需要权衡其优缺点,并且注意潜在的风险。在某些情况下,使用VLA特性与动态内存 malloc 分配,可能会是一个不错的选择。- y; q1 o/ b* u& K7 n$ G6 l. B
-END-! C( Z1 A% i' ?" ~. f
往期推荐:点击图片即可跳转阅读, l5 i0 b- l0 K2 g0 k
1 M$ C4 F( d& a8 _$ J
8 T4 \+ I% L. W$ Z: u; n
: R! N8 h" ]8 z5 D
7 h9 v, K! D M0 [2 C
wgjszsgrf1c6407366426.jpg
# N* F% f+ k/ ]" J8 \+ m
% e+ ^5 T, I& s+ V" t" n/ l" F 嵌入式物联网开发,搭建属于自己的云服务器, L' W, Q8 v3 [* S
& W0 |/ R+ B7 `0 ]7 S/ O+ q 7 _7 |+ p- s* X! u- H; C
+ `6 K Q' D; t3 b# r) g! W; m
6 _- X; h' d9 N' o
vrxynttafwj6407366526.jpg
5 D& X3 K) I: A' w+ G8 L
% h( G1 F2 k% N5 Z/ x 嵌入式处理器芯片,已经进入了高算力时代!) N# c, B: C& a
3 a7 U( ]" Z" o1 u
2 Z! o! O& ?! I* R
3 c6 P$ k( v( D; J
lcai4g3y2rp6407366626.jpg
: `8 t7 m9 t( s: O
) E' O3 c& [7 b5 N 星闪,一项迫于无奈的创新技术!
( i6 ?: \! y& W8 |
C; h: u" M& H2 k- C
% A$ u0 e+ Y1 L; ^
( l8 n" E$ o4 T# d4 R V2 V+ p+ ~ 我是老温,一名热爱学习的嵌入式工程师
/ s) ]* z- ]! Q, S, w关注我,一起变得更加优秀! |
|