|
我是老温,一名热爱学习的嵌入式工程师
@9 M. p8 D7 t T关注我,一起变得更加优秀!7 b& {; W$ ` B. O1 \9 L/ `
我们在编写 C 语言程序的时候,如果使用的编译器只支持 C89 标准,那么,在定义数组的时候,数组长度必须确定,例如:int arr[10],因为数组是静态分配内存的,所以数组的长度必须要在编译时进行确定。0 s0 I8 s, z" Z7 j3 F5 x
当然,我们也可以采用指针变量和动态内存分配的方式,来模拟动态数组的行为,可以使用 malloc 或者 calloc 相关的函数,在程序运行时进行动态内存分配。" w2 E, O5 e1 L- ?) H i
示例代码如下:#include #include ) b! J- ?5 c( ~ K( k; Y( |, c
int main() { int *arr = NULL; int n = 10; // 动态分配数组 arr = (int *)malloc(n * sizeof(int));
. P3 N- N; c% u9 i) K if (arr == NULL)return -1; // 使用数组 for (int i = 0; i arr = i; }
+ a7 |/ i7 O4 Y- B. J& a // 打印数组内容 for (int i = 0; i printf("%d \mn ", arr); }0 J7 h( u U! L, i$ f* ~
// 释放内存 if(NULL != arr)free(arr);6 ]( a5 g0 z! r. e. G$ {
return 0;}9 x; u1 t- ^3 C; B& r, t
然而,除了使用 malloc 来模拟实现动态数组的功能之外,在 C 语言的 C99 标准里面,还引入了可变长数组(VLA)的概念,也就是说,可以允许数组的长度在程序运行时进行确定。
% s" Z/ r6 w7 X6 Z! P6 J示例代码如下: #include
+ F4 v; k' d: [9 I) W3 Cint main() { int n = 0; printf("Enter the number of elements: "); scanf("%d", &n);. ?& k2 W p* G7 ~9 c0 { G' i7 s
// 创建一个VLA int arr[n];
/ K9 p5 j& _$ U" W8 s+ `- J! S5 R // 使用VLA for (int i = 0; i arr = i * i; }- A! p" R; U- T& I( x7 H x. G" p
// 打印数组内容 for (int i = 0; i printf("%d \mn", arr); }/ J: N7 a* o! s( _
return 0;}4 G7 j' a& c, `6 d+ V' s
C99 标准里面的可变长数组特性,它允许数组在运行时才确定大小,尤其是在处理大小不确定的数据集时,可变长数组(VLA)为程序员提供了更大的灵活性。% I y# [% p- Y
使用可变长数组(VLA)的优势:
5 v! p6 q* F3 ^- \1、动态分配大小:使用可变长数组,可以根据实际需要,在程序运行时分配数组的带下,在处理不确定大小的数据集时,非常有用。
0 d" B6 V! [% l# w8 X I; q; ~2、减少内存浪费:由于可变长数组是运行时才确定其大小的,因此可以避免在编译时分配固定内存,造成内存浪费。: |" Y- N9 `6 B0 x; _* K
但是,可变长数组(VLA)这种特性有利也有弊,在使用的时候需要注意一些潜在的问题。( n$ e! R4 r1 |( j- P% T
使用可变长数组的注意事项:
2 R' A4 |0 r( t9 j0 i1、编译器兼容问题:不是所有的编译器都支持 C99 标准里面的VLA特性,并且可能需要特定的编译器标志位来启用。# g7 j1 Y* b1 r7 r% h/ ]9 Q
2、程序可移植性:VLA特性在 C11 标准里面已经被进行标记,可能会在未来的 C 语言标准中移除,因此需要注意代码的可移植性。
8 u6 g- ~: J6 W" s0 h3、栈溢出风险:VLA在程序运行时分配数组空间大小,其位于内存的栈区域,使用不当可能会导致栈溢出。' {; A! e/ S2 t7 ?" z
4、性能优化问题:编译器可能无法对VLA进行优化,其代码性能可能不如静态分配数组或使用malloc分配内存。$ H. D4 B p }: T1 d
总的来说,可变长数组(VLA)特性,在编译时不确定数组大小,而是在程序运行时才确定,在使用时需要权衡其优缺点,并且注意潜在的风险。在某些情况下,使用VLA特性与动态内存 malloc 分配,可能会是一个不错的选择。* G# q7 S, p. l: Z% g
-END- @6 G: T1 h J' g
往期推荐:点击图片即可跳转阅读
E5 Q# a" d4 |" I: w * W* x! `' l, ?4 x) s4 B3 O5 i# i
- w7 l3 M; u7 G$ A) }' r 1 p0 o) j7 e+ ~
! Q: o2 \4 q0 L% X
rjbno2gb2fm64020414111.jpg
! q+ n4 S( [' B7 [2 x % E( Q$ X6 n S, ?3 F
嵌入式物联网开发,搭建属于自己的云服务器- l5 |, I8 u' J8 M% t6 U
$ t0 x, Q5 {8 I0 B5 j+ d L( B- m; k8 a
. s& I/ X( M+ B& |! l% a `
/ {5 N* x T6 w: t- s8 ` * R4 l9 |1 I( J- G3 D2 I& p
bfhzp2olwq264020414211.jpg
* l- E. E* I( G) q' r
/ v9 y& A, j {) R( b6 @ 嵌入式处理器芯片,已经进入了高算力时代!% p9 R9 \& \* g c; G, N
, {3 L F; Q* {+ V( a! e O
9 J; E- T- c, ^( x' r
0 Q3 E0 R9 k1 r& {2 Y& h0 N9 C
jiiahgn3etq64020414311.jpg
7 y# \& f7 A% b) ^+ }+ j5 h ; D \8 O" A, h* Y) B
星闪,一项迫于无奈的创新技术!
' z$ @, v7 }% Z$ H ; u1 e. Q" ~ S- `( y; l& t8 W
9 l4 ~8 N# N& G% k* C2 h0 X6 y ) b0 p5 I% e1 ^; t% A) ^; w
我是老温,一名热爱学习的嵌入式工程师" c% N3 d: b( z7 j, H0 H$ P
关注我,一起变得更加优秀! |
|