|

我是老温,一名热爱学习的嵌入式工程师
6 Q4 C. |" |8 }' W关注我,一起变得更加优秀!
$ e5 f0 q' ?0 M, T我们在编写 C 语言程序的时候,如果使用的编译器只支持 C89 标准,那么,在定义数组的时候,数组长度必须确定,例如:int arr[10],因为数组是静态分配内存的,所以数组的长度必须要在编译时进行确定。
+ V1 }( i: s" K9 }4 c# C当然,我们也可以采用指针变量和动态内存分配的方式,来模拟动态数组的行为,可以使用 malloc 或者 calloc 相关的函数,在程序运行时进行动态内存分配。2 d% S+ C! Y2 N: E6 }* C& Y2 C
示例代码如下:#include #include
4 H* U8 k9 T( f) E: Kint main() { int *arr = NULL; int n = 10; // 动态分配数组 arr = (int *)malloc(n * sizeof(int));
. y& N. c5 W" q/ c) [! ~% z if (arr == NULL)return -1; // 使用数组 for (int i = 0; i arr = i; }6 F4 M6 `$ d7 M* L! q
// 打印数组内容 for (int i = 0; i printf("%d \mn ", arr); }
8 I, \& h2 b! f7 P* l // 释放内存 if(NULL != arr)free(arr);
7 R+ N- l4 _( [4 b- u return 0;}
% ]% A6 T* ^6 l# N6 ^然而,除了使用 malloc 来模拟实现动态数组的功能之外,在 C 语言的 C99 标准里面,还引入了可变长数组(VLA)的概念,也就是说,可以允许数组的长度在程序运行时进行确定。# \3 L2 I% |% d" i$ w
示例代码如下: #include
; M; P X; k) H1 e8 n( p3 O" l1 Sint main() { int n = 0; printf("Enter the number of elements: "); scanf("%d", &n);
) d/ i0 s' v% r& K* I4 t // 创建一个VLA int arr[n];% I' g8 L& F# r, a/ F; I
// 使用VLA for (int i = 0; i arr = i * i; }
2 H7 f0 t* h8 C" c* X // 打印数组内容 for (int i = 0; i printf("%d \mn", arr); }
/ F/ s: j- }" u return 0;}
# p6 l$ i4 Y* c* i# b5 D+ UC99 标准里面的可变长数组特性,它允许数组在运行时才确定大小,尤其是在处理大小不确定的数据集时,可变长数组(VLA)为程序员提供了更大的灵活性。
$ Y# W/ h8 ~3 K7 s, S9 ?6 r使用可变长数组(VLA)的优势:
; N# O. ?3 `# M5 j E; W3 ~1、动态分配大小:使用可变长数组,可以根据实际需要,在程序运行时分配数组的带下,在处理不确定大小的数据集时,非常有用。5 U# `, m: ~9 ?: r% z) N
2、减少内存浪费:由于可变长数组是运行时才确定其大小的,因此可以避免在编译时分配固定内存,造成内存浪费。
# i9 A1 N4 X/ n但是,可变长数组(VLA)这种特性有利也有弊,在使用的时候需要注意一些潜在的问题。
2 ^2 \$ X$ M9 e6 H4 |; u使用可变长数组的注意事项:4 w* y; B4 n) P7 l6 `: R. e
1、编译器兼容问题:不是所有的编译器都支持 C99 标准里面的VLA特性,并且可能需要特定的编译器标志位来启用。
( Y& n4 I `* D% ~2、程序可移植性:VLA特性在 C11 标准里面已经被进行标记,可能会在未来的 C 语言标准中移除,因此需要注意代码的可移植性。- o; [; F9 D5 d$ h% x3 s& d5 d
3、栈溢出风险:VLA在程序运行时分配数组空间大小,其位于内存的栈区域,使用不当可能会导致栈溢出。9 K; D: _9 W3 q6 c
4、性能优化问题:编译器可能无法对VLA进行优化,其代码性能可能不如静态分配数组或使用malloc分配内存。' |0 H3 W7 v' d$ O9 I6 M0 E5 I
总的来说,可变长数组(VLA)特性,在编译时不确定数组大小,而是在程序运行时才确定,在使用时需要权衡其优缺点,并且注意潜在的风险。在某些情况下,使用VLA特性与动态内存 malloc 分配,可能会是一个不错的选择。
" F- Z- k( v3 f1 W5 R3 t. S-END-
6 y) v! ?6 H% ?往期推荐:点击图片即可跳转阅读" `+ i. p Y7 D3 P( E
, q* W# O3 }+ [3 t. j; w: ^8 L9 b6 R 7 }. D5 J7 ?. f3 U
. {% @; N0 }, l! h
+ S- g& u6 |* a! c
qegpg5sxzmr64012812342.jpg
% w4 F' l/ j6 N" ^ - a1 U1 P8 ?/ c4 R" P# s
嵌入式物联网开发,搭建属于自己的云服务器
8 f- E1 b" y/ X' f7 }! L
" k. K- Y6 O) j" U$ r. c9 Q & n& g4 O; J4 x: o* X
$ y& _% t C6 _ D- N + G1 R* i4 T$ q! K
bwmvb3ml0gd64012812442.jpg
, B9 ]" q( L! {- }2 F1 P 2 h$ }$ J. j3 d& ~0 F
嵌入式处理器芯片,已经进入了高算力时代!2 B! z) I1 s& _7 ~
# J5 Y. b3 t) m& q: q& |" K8 ~
6 O1 m) Y+ v$ D3 z' o- T* i8 w
. p$ D! {. s1 \0 L/ P2 Y6 W* A7 P
fxmy1b5f10j64012812542.jpg
7 ^8 n9 ]2 ~$ W6 e, f P" X) N
7 P' N6 Q) u6 d: i8 a 星闪,一项迫于无奈的创新技术!
2 a: e, Y% S3 O2 m & E( L" S- s" R. n4 e3 i y
' N0 I8 _2 H) i* M5 t; H. S9 l2 H
: V$ k: e V# {& s, b
我是老温,一名热爱学习的嵌入式工程师
* w- e: T% u" H关注我,一起变得更加优秀! |
|