|

我是老温,一名热爱学习的嵌入式工程师
/ X, r3 s; g* l& u5 _; z关注我,一起变得更加优秀!
/ Q0 o2 X5 c+ k9 {! H" |* Q我们在编写 C 语言程序的时候,如果使用的编译器只支持 C89 标准,那么,在定义数组的时候,数组长度必须确定,例如:int arr[10],因为数组是静态分配内存的,所以数组的长度必须要在编译时进行确定。- j g+ @( W2 _9 E8 x) X6 Z
当然,我们也可以采用指针变量和动态内存分配的方式,来模拟动态数组的行为,可以使用 malloc 或者 calloc 相关的函数,在程序运行时进行动态内存分配。
/ K9 g8 m# J4 `示例代码如下:#include #include
- {5 {* Q# ~( v `# {1 X5 T& pint main() { int *arr = NULL; int n = 10; // 动态分配数组 arr = (int *)malloc(n * sizeof(int));8 C5 I P. l& O4 D* u9 Y
if (arr == NULL)return -1; // 使用数组 for (int i = 0; i arr = i; }
" s9 E8 u, y* B7 ^ // 打印数组内容 for (int i = 0; i printf("%d \mn ", arr); } n! i3 \0 C8 y* q# p
// 释放内存 if(NULL != arr)free(arr);4 i) E# c. a# C
return 0;}
& c5 J2 m6 I* r+ a1 S6 y' s% x然而,除了使用 malloc 来模拟实现动态数组的功能之外,在 C 语言的 C99 标准里面,还引入了可变长数组(VLA)的概念,也就是说,可以允许数组的长度在程序运行时进行确定。
R" ?5 ]3 L7 G0 a* \示例代码如下: #include
' h7 S6 V: Q# j3 jint main() { int n = 0; printf("Enter the number of elements: "); scanf("%d", &n);+ l4 u1 ]+ `+ c7 j7 y+ Y) m2 U% ]
// 创建一个VLA int arr[n];$ E' t' E) U# J2 q
// 使用VLA for (int i = 0; i arr = i * i; }
T5 W7 b- P/ Q- P4 @7 V) f; h% D // 打印数组内容 for (int i = 0; i printf("%d \mn", arr); }
( t: ~+ ~0 `! Z return 0;}) Z7 R K4 D: N- f4 E, _ Z, g1 R; M
C99 标准里面的可变长数组特性,它允许数组在运行时才确定大小,尤其是在处理大小不确定的数据集时,可变长数组(VLA)为程序员提供了更大的灵活性。
* [9 ]2 E7 K# p% i1 `8 m使用可变长数组(VLA)的优势:1 _( |" R8 n5 ], r4 I; {
1、动态分配大小:使用可变长数组,可以根据实际需要,在程序运行时分配数组的带下,在处理不确定大小的数据集时,非常有用。( z: S- i/ ^% Z8 f3 K
2、减少内存浪费:由于可变长数组是运行时才确定其大小的,因此可以避免在编译时分配固定内存,造成内存浪费。+ h0 _/ p- A5 V- X+ v6 z
但是,可变长数组(VLA)这种特性有利也有弊,在使用的时候需要注意一些潜在的问题。8 P4 J) }" h d E
使用可变长数组的注意事项:
/ {3 t% K/ c: A, m% G1、编译器兼容问题:不是所有的编译器都支持 C99 标准里面的VLA特性,并且可能需要特定的编译器标志位来启用。
" C( @6 y/ R% c1 s& T$ y; ~5 T( n2、程序可移植性:VLA特性在 C11 标准里面已经被进行标记,可能会在未来的 C 语言标准中移除,因此需要注意代码的可移植性。
L+ `( Q' E* d, R) }+ l0 y# V3、栈溢出风险:VLA在程序运行时分配数组空间大小,其位于内存的栈区域,使用不当可能会导致栈溢出。
$ F4 q8 B a3 v- ]6 m( Q4、性能优化问题:编译器可能无法对VLA进行优化,其代码性能可能不如静态分配数组或使用malloc分配内存。
" v( t7 q$ ^. r; Q总的来说,可变长数组(VLA)特性,在编译时不确定数组大小,而是在程序运行时才确定,在使用时需要权衡其优缺点,并且注意潜在的风险。在某些情况下,使用VLA特性与动态内存 malloc 分配,可能会是一个不错的选择。3 S8 U0 G" a& B7 r! p- |3 z) Z, g/ I
-END-
; p- d6 ~8 y: y6 q8 \3 E7 P3 |往期推荐:点击图片即可跳转阅读" E/ P% h. D/ n( c
' D0 S2 A- E0 G0 ^4 v4 K
- ?. E( J- N1 N% Q : s9 E" C1 A* Z. Y3 F
( ]' S! i- g( ~7 A6 O5 \ U/ X
lrdgr3pz1cv6401453706.jpg
9 X, b5 A, A1 W+ u
* ~& e# H% ]1 R( k; j 嵌入式物联网开发,搭建属于自己的云服务器+ \4 O* |1 ?" l7 y4 d. _; e, @
P/ u5 g) g/ P I! Z1 E* w
2 L. L9 C" t, T2 f! u# i) l S ) Y9 G3 h; Q J4 [* t. `
! Q) c: i' k, c
bku1mu4qs5l6401453806.jpg
S# ~- y- F$ L* C- k3 G" d0 [2 T
: O! t. x- \# c9 g 嵌入式处理器芯片,已经进入了高算力时代!
) D$ }) m8 \. g# t: U : b- v9 Z1 y" t$ ^9 p" L
, \4 \) P/ z/ |- G! J0 \" t' e( t
2 E2 A4 I# U! F% v) k3 T( [1 T
li0vxm14q016401453906.jpg
: g- h7 K3 t) m
% u, T: X. j9 C& V9 y 星闪,一项迫于无奈的创新技术!
- N! T5 G7 Z# O
8 Q" [4 M# o" S5 O- y + w' u. Z( p: w) i( z
" u5 z6 K5 z9 L" g 我是老温,一名热爱学习的嵌入式工程师2 L" h. |0 p& v K" X
关注我,一起变得更加优秀! |
|