|
我是老温,一名热爱学习的嵌入式工程师
9 E. J w. W( ]6 C+ Z8 G关注我,一起变得更加优秀!
U3 Z8 D4 V& D: G4 q8 n3 O我们在编写 C 语言程序的时候,如果使用的编译器只支持 C89 标准,那么,在定义数组的时候,数组长度必须确定,例如:int arr[10],因为数组是静态分配内存的,所以数组的长度必须要在编译时进行确定。
& ?0 T8 U# K: f2 R) d当然,我们也可以采用指针变量和动态内存分配的方式,来模拟动态数组的行为,可以使用 malloc 或者 calloc 相关的函数,在程序运行时进行动态内存分配。
; E! G ?! C: |# ^) J! h( a示例代码如下:#include #include ) \! B h7 t% n I8 }
int main() { int *arr = NULL; int n = 10; // 动态分配数组 arr = (int *)malloc(n * sizeof(int));% D! B) ]7 ?3 a7 ~+ P c
if (arr == NULL)return -1; // 使用数组 for (int i = 0; i arr = i; }
# t" ~$ S7 X$ E' w. c# M. o // 打印数组内容 for (int i = 0; i printf("%d \mn ", arr); }
1 k$ |7 c$ s( z, V+ I // 释放内存 if(NULL != arr)free(arr);. a% G- M. |1 Z& Q) w$ ]! ^
return 0;}
5 e) p4 w3 n1 {+ J然而,除了使用 malloc 来模拟实现动态数组的功能之外,在 C 语言的 C99 标准里面,还引入了可变长数组(VLA)的概念,也就是说,可以允许数组的长度在程序运行时进行确定。9 S& j! I1 U0 o3 u' ?0 R5 S0 y
示例代码如下: #include - q: J7 ^: p9 u' M
int main() { int n = 0; printf("Enter the number of elements: "); scanf("%d", &n);
" \7 w! ~9 k0 _! D! |, j: z // 创建一个VLA int arr[n];8 y2 L) t. d# Y, p% K
// 使用VLA for (int i = 0; i arr = i * i; }
& b2 K, {3 _, \# T" h6 S- c // 打印数组内容 for (int i = 0; i printf("%d \mn", arr); }# ~1 c& q% U0 \; M! _$ Q
return 0;}
7 l0 k/ V( U3 Y' W, g; N' ~( r5 ZC99 标准里面的可变长数组特性,它允许数组在运行时才确定大小,尤其是在处理大小不确定的数据集时,可变长数组(VLA)为程序员提供了更大的灵活性。
' Z8 p. O( {% R4 l4 H使用可变长数组(VLA)的优势:
" L6 u9 A x; ?0 `1、动态分配大小:使用可变长数组,可以根据实际需要,在程序运行时分配数组的带下,在处理不确定大小的数据集时,非常有用。% [7 h4 _! R1 z! @4 N
2、减少内存浪费:由于可变长数组是运行时才确定其大小的,因此可以避免在编译时分配固定内存,造成内存浪费。: r% Z: [8 T* S5 {: u! O: i# }
但是,可变长数组(VLA)这种特性有利也有弊,在使用的时候需要注意一些潜在的问题。
3 x! K" E+ Z# g) Z$ y) ?$ A& ~使用可变长数组的注意事项:& w) X3 U* |0 b+ G
1、编译器兼容问题:不是所有的编译器都支持 C99 标准里面的VLA特性,并且可能需要特定的编译器标志位来启用。7 D: q+ f& r F2 a
2、程序可移植性:VLA特性在 C11 标准里面已经被进行标记,可能会在未来的 C 语言标准中移除,因此需要注意代码的可移植性。
8 w; B- U& m! D$ i% C g3、栈溢出风险:VLA在程序运行时分配数组空间大小,其位于内存的栈区域,使用不当可能会导致栈溢出。
1 [, T( Q8 a9 h( J5 ]+ B, _9 R3 y- y4、性能优化问题:编译器可能无法对VLA进行优化,其代码性能可能不如静态分配数组或使用malloc分配内存。
f S0 G" f: {5 ^$ k$ U# s2 h# m总的来说,可变长数组(VLA)特性,在编译时不确定数组大小,而是在程序运行时才确定,在使用时需要权衡其优缺点,并且注意潜在的风险。在某些情况下,使用VLA特性与动态内存 malloc 分配,可能会是一个不错的选择。, y/ H8 z+ d/ D# \
-END-. ^" ?0 L R' m6 s! k
往期推荐:点击图片即可跳转阅读0 C( R' i/ \8 J0 |
; ~9 S+ t1 r8 S! m, l! n2 D" M; G' s
( u n+ z7 q, ^
5 p. |& R$ k* d
: [$ L1 Q# Y( Q- C6 u, M% G q
cjlk1aezf3e64012779631.jpg
0 J( x! y0 Y. v+ G
0 {. Z6 b! y6 e; W% h
嵌入式物联网开发,搭建属于自己的云服务器0 X) p" l* }' y+ ^5 Q
1 y, y3 W" N; R( x3 r5 t( D
5 n, _2 _) C$ F. d" x7 E
6 x; W/ k8 U2 l1 P: l( [/ W
2 _1 r* K; R7 ~& \% d3 ]
tm52p5jvugz64012779731.jpg
0 }% A D) ]* b. U 7 {7 u$ X k0 q
嵌入式处理器芯片,已经进入了高算力时代! S6 o, b/ C. ]0 M8 q
. o: N# c" }9 L/ c/ g
- t, E: j3 Z4 l
) C3 K$ `1 } S
pqvrzhiql4h64012779831.jpg
# ?1 T+ p0 f. @$ P
o# z' w& F7 j9 @; ?. Q7 | 星闪,一项迫于无奈的创新技术!
5 M' }, Y3 N" R6 H! d( c0 ~ ! {, o. k6 D6 a4 g: Y1 L8 Q
4 i. T, @1 z$ Y. @8 `* c
4 Y9 l1 o4 A5 J2 K/ W8 k. i/ ?* I% g( H 我是老温,一名热爱学习的嵌入式工程师 i2 c' B7 E1 k4 Q/ c
关注我,一起变得更加优秀! |
|