|

我是老温,一名热爱学习的嵌入式工程师
* P4 @5 J& a* R( A关注我,一起变得更加优秀!# f; t% R* R' F6 J
我们在编写 C 语言程序的时候,如果使用的编译器只支持 C89 标准,那么,在定义数组的时候,数组长度必须确定,例如:int arr[10],因为数组是静态分配内存的,所以数组的长度必须要在编译时进行确定。
. f7 m, W' S; |当然,我们也可以采用指针变量和动态内存分配的方式,来模拟动态数组的行为,可以使用 malloc 或者 calloc 相关的函数,在程序运行时进行动态内存分配。& r3 ]- H4 N* R% y: b/ r* N
示例代码如下:#include #include " x5 R, ?! u- L! M
int main() { int *arr = NULL; int n = 10; // 动态分配数组 arr = (int *)malloc(n * sizeof(int));
) U K/ d1 k- r3 m if (arr == NULL)return -1; // 使用数组 for (int i = 0; i arr = i; }
. p9 E+ m% ]/ v6 @ // 打印数组内容 for (int i = 0; i printf("%d \mn ", arr); }, q+ `' Y% l4 r4 j+ a
// 释放内存 if(NULL != arr)free(arr);+ [( m0 W, @$ R% Q/ |* X& H, z: K' }
return 0;}
& D2 q' e& h k* k; M: V& U然而,除了使用 malloc 来模拟实现动态数组的功能之外,在 C 语言的 C99 标准里面,还引入了可变长数组(VLA)的概念,也就是说,可以允许数组的长度在程序运行时进行确定。; k3 y5 h4 A, M
示例代码如下: #include
4 H" q& m+ ]3 A. i" `. Hint main() { int n = 0; printf("Enter the number of elements: "); scanf("%d", &n);
, ?, q- c/ O8 }9 K& f4 E* E2 A // 创建一个VLA int arr[n];
, k8 n6 K) z' g' f& K, k+ c // 使用VLA for (int i = 0; i arr = i * i; }! B* Z& q4 D. Q' s" K
// 打印数组内容 for (int i = 0; i printf("%d \mn", arr); }
' @! c& U- t; u) C1 y( t return 0;}
# K' d7 c/ N% f4 K" FC99 标准里面的可变长数组特性,它允许数组在运行时才确定大小,尤其是在处理大小不确定的数据集时,可变长数组(VLA)为程序员提供了更大的灵活性。7 u8 k7 I Y: h. e
使用可变长数组(VLA)的优势:5 x6 \# q' v. S$ x8 p
1、动态分配大小:使用可变长数组,可以根据实际需要,在程序运行时分配数组的带下,在处理不确定大小的数据集时,非常有用。: o0 \0 P, }/ [4 o6 Y Q, X
2、减少内存浪费:由于可变长数组是运行时才确定其大小的,因此可以避免在编译时分配固定内存,造成内存浪费。+ v w: U* A* k& s$ k& J
但是,可变长数组(VLA)这种特性有利也有弊,在使用的时候需要注意一些潜在的问题。9 U. m7 _$ _, N! u+ M$ Z
使用可变长数组的注意事项:
+ e5 F( a3 s" F2 ~1、编译器兼容问题:不是所有的编译器都支持 C99 标准里面的VLA特性,并且可能需要特定的编译器标志位来启用。0 C U( a2 ]$ k
2、程序可移植性:VLA特性在 C11 标准里面已经被进行标记,可能会在未来的 C 语言标准中移除,因此需要注意代码的可移植性。
! J1 Y( f5 U: ?5 v3、栈溢出风险:VLA在程序运行时分配数组空间大小,其位于内存的栈区域,使用不当可能会导致栈溢出。
7 ^8 G9 J5 n$ s+ ?+ x0 y4、性能优化问题:编译器可能无法对VLA进行优化,其代码性能可能不如静态分配数组或使用malloc分配内存。7 A& ]- t& S- S
总的来说,可变长数组(VLA)特性,在编译时不确定数组大小,而是在程序运行时才确定,在使用时需要权衡其优缺点,并且注意潜在的风险。在某些情况下,使用VLA特性与动态内存 malloc 分配,可能会是一个不错的选择。
( R8 a9 A/ M2 Y-END-( Z' @1 \, |3 _" o6 {* K
往期推荐:点击图片即可跳转阅读! B8 C: H t% I ^6 F
: f& k* a( b3 M' m& o
" U C/ g! c: W! Z6 L6 K
7 r% ]4 j0 e' e0 C5 u ; D# A8 ^. k, o) ]9 W+ p
ozw1x12xsth6405416225.jpg
4 a7 r% X- D! r" c- c0 `& H * E7 y N2 l V3 n# F* b
嵌入式物联网开发,搭建属于自己的云服务器1 |4 e) ? W& Z/ i V8 ~; t; e) D' G) I
+ X( }9 j% P- _' e5 ^! Z& v8 C0 U4 @ 8 T# E$ f9 q) T2 J' C: Q2 c
- H; \* _5 u* A& P8 l% w) m ! o0 V' E& i# k
dm15ntx4k4q6405416325.jpg
6 S% n( k- ^% m6 L+ R# l; H) l* A * n+ ^: q) `2 j
嵌入式处理器芯片,已经进入了高算力时代!
0 K2 i2 r2 A4 }) e, x, S 3 s& B/ t/ t0 \6 W# I
' N/ z5 T$ D6 f* s' q
% y- {0 o& X& p. B
5uzytybisb36405416425.jpg
' n% h% F0 L& n8 e$ l6 }- P
0 }/ E$ F; w' |7 v; i 星闪,一项迫于无奈的创新技术!) b5 \0 _; E, W/ z
9 `- m/ {% v3 Y6 y; y- R: K- [2 l
1 Q% ]/ l; V+ a) T; R) i/ A5 b
( _* K. f3 ^% n& ~8 {5 m' | 我是老温,一名热爱学习的嵌入式工程师) u! M! y' N/ j; Q7 Y$ a4 N! W
关注我,一起变得更加优秀! |
|