|
我是老温,一名热爱学习的嵌入式工程师" X, ~; t2 B H3 A
关注我,一起变得更加优秀!
6 r, H, n3 ^) }" O5 Z+ K我们在编写 C 语言程序的时候,如果使用的编译器只支持 C89 标准,那么,在定义数组的时候,数组长度必须确定,例如:int arr[10],因为数组是静态分配内存的,所以数组的长度必须要在编译时进行确定。
- O, u g- x, E5 E6 P7 D0 o L当然,我们也可以采用指针变量和动态内存分配的方式,来模拟动态数组的行为,可以使用 malloc 或者 calloc 相关的函数,在程序运行时进行动态内存分配。8 j* V0 ?# T6 V+ x* i, ~5 a% ~
示例代码如下:#include #include
/ r n3 `" F2 p0 V9 C# aint main() { int *arr = NULL; int n = 10; // 动态分配数组 arr = (int *)malloc(n * sizeof(int));
6 p; f/ I+ g A( ^( e+ \6 b if (arr == NULL)return -1; // 使用数组 for (int i = 0; i arr = i; }# v+ _! s& L3 T
// 打印数组内容 for (int i = 0; i printf("%d \mn ", arr); }
5 g- d# y% p+ v& `5 ~8 l // 释放内存 if(NULL != arr)free(arr);8 y" j4 s% i, X9 X+ Q% e$ S, z. \
return 0;}
2 l5 n/ Y: K) J2 u$ B- L! p3 A然而,除了使用 malloc 来模拟实现动态数组的功能之外,在 C 语言的 C99 标准里面,还引入了可变长数组(VLA)的概念,也就是说,可以允许数组的长度在程序运行时进行确定。
9 F% X- U/ r, E$ w7 ^示例代码如下: #include / Q% S7 G/ C. J/ j! {; {
int main() { int n = 0; printf("Enter the number of elements: "); scanf("%d", &n);/ Y# s" W4 a$ X0 t0 E4 L
// 创建一个VLA int arr[n];' X2 f9 a o6 P$ e5 c$ ?: X" X2 a
// 使用VLA for (int i = 0; i arr = i * i; }; ?. I3 D: B' @- S& G( o
// 打印数组内容 for (int i = 0; i printf("%d \mn", arr); }
: L9 K6 e% ]. b& X return 0;}- k2 s- R6 [% I3 @9 H
C99 标准里面的可变长数组特性,它允许数组在运行时才确定大小,尤其是在处理大小不确定的数据集时,可变长数组(VLA)为程序员提供了更大的灵活性。
0 `3 A& N1 Z5 Z4 X7 Y! a& e使用可变长数组(VLA)的优势:4 X- d8 g# ~" ?7 u# m# X
1、动态分配大小:使用可变长数组,可以根据实际需要,在程序运行时分配数组的带下,在处理不确定大小的数据集时,非常有用。
' F0 {. b+ y4 F2、减少内存浪费:由于可变长数组是运行时才确定其大小的,因此可以避免在编译时分配固定内存,造成内存浪费。
/ Z+ N9 B! N% W; s+ J但是,可变长数组(VLA)这种特性有利也有弊,在使用的时候需要注意一些潜在的问题。
^2 M# z9 w, C; w使用可变长数组的注意事项:: H, h! W4 W3 [- T% l
1、编译器兼容问题:不是所有的编译器都支持 C99 标准里面的VLA特性,并且可能需要特定的编译器标志位来启用。+ x2 m p0 H+ M, S% k7 p* ~
2、程序可移植性:VLA特性在 C11 标准里面已经被进行标记,可能会在未来的 C 语言标准中移除,因此需要注意代码的可移植性。
+ ~6 B% K, g J/ P& P1 B5 F3、栈溢出风险:VLA在程序运行时分配数组空间大小,其位于内存的栈区域,使用不当可能会导致栈溢出。: i: U. s9 b6 u' r) q2 s( g
4、性能优化问题:编译器可能无法对VLA进行优化,其代码性能可能不如静态分配数组或使用malloc分配内存。
' H7 \# R. P( \4 W总的来说,可变长数组(VLA)特性,在编译时不确定数组大小,而是在程序运行时才确定,在使用时需要权衡其优缺点,并且注意潜在的风险。在某些情况下,使用VLA特性与动态内存 malloc 分配,可能会是一个不错的选择。4 v: F+ _ b+ t# K
-END-0 |9 C- v& A" K4 u L8 n
往期推荐:点击图片即可跳转阅读
2 G) t3 H' b3 w) }. B
3 S( ^& _: h- x
' z0 D! J4 g/ X1 @ : R/ F* W' z, }$ R4 a, G6 }% ^
6 b8 M O% |1 }* S" C8 ]8 y- z
3lq3mdps5w46405234053.jpg
3 }, q' Z( D# \: l$ A 5 R$ E# t$ E, n4 H7 O6 P
嵌入式物联网开发,搭建属于自己的云服务器
1 ]' p4 v9 W/ D$ G $ S1 A ^ U3 n# J5 p
, h7 w5 c% }; q' Q4 ` C
! M% y7 [3 U* P/ {6 G5 s
$ S) e9 n1 j5 v8 s
aghrfgtfiiy6405234154.jpg
$ I" w3 B9 ]% n4 m4 c
2 H$ X; h. R; g7 A: ~, O" D' i [1 o 嵌入式处理器芯片,已经进入了高算力时代!' F. W/ a: s% w' r% [
$ @, u% O9 ^& e5 ?, S& B# D: s $ N' I) B, K. a
9 d6 p. T+ Y* |( }" g. D
zqgusz25kxv6405234254.jpg
' r/ [- O+ N7 I8 l9 l; ?
, j4 I& V3 l' H8 M* f 星闪,一项迫于无奈的创新技术!: t' n9 Z" D, C/ z/ k
& M1 |2 v& `: y9 C
2 ~0 h/ [' l5 P' Z, f T
+ b2 T# Q3 W5 k% ~' C 我是老温,一名热爱学习的嵌入式工程师6 K. O% c3 l2 w; U$ f, X2 a
关注我,一起变得更加优秀! |
|