|

我是老温,一名热爱学习的嵌入式工程师
* p4 q+ Q& N: O4 d3 V% S7 M4 I关注我,一起变得更加优秀!
6 y2 O- x4 X; e我们在编写 C 语言程序的时候,如果使用的编译器只支持 C89 标准,那么,在定义数组的时候,数组长度必须确定,例如:int arr[10],因为数组是静态分配内存的,所以数组的长度必须要在编译时进行确定。# f- K. ?: r6 _$ J2 G- M" N p
当然,我们也可以采用指针变量和动态内存分配的方式,来模拟动态数组的行为,可以使用 malloc 或者 calloc 相关的函数,在程序运行时进行动态内存分配。
4 S0 E0 \$ r. d2 d2 X示例代码如下:#include #include & \% b y$ H) S4 ?* u/ M! M# [
int main() { int *arr = NULL; int n = 10; // 动态分配数组 arr = (int *)malloc(n * sizeof(int));
2 r) J p: v6 X0 I if (arr == NULL)return -1; // 使用数组 for (int i = 0; i arr = i; }- u$ d2 k0 j c+ O
// 打印数组内容 for (int i = 0; i printf("%d \mn ", arr); }5 m# g, s3 @4 x
// 释放内存 if(NULL != arr)free(arr);
' G* A2 e" Q) }+ g( u5 i. L2 q return 0;}
$ p. R1 U# a. ]% r* h% O# u然而,除了使用 malloc 来模拟实现动态数组的功能之外,在 C 语言的 C99 标准里面,还引入了可变长数组(VLA)的概念,也就是说,可以允许数组的长度在程序运行时进行确定。$ `) B2 Q) n, E/ u0 h" d
示例代码如下: #include & g, H4 ~3 F+ \
int main() { int n = 0; printf("Enter the number of elements: "); scanf("%d", &n);
4 z1 ?9 G9 h5 F; ~( A) e // 创建一个VLA int arr[n];
$ \; A- J m& `) ^# F% Y$ U4 ? // 使用VLA for (int i = 0; i arr = i * i; }7 i# L$ {0 ]5 b" [" Q W. ?' F. ]
// 打印数组内容 for (int i = 0; i printf("%d \mn", arr); }4 j1 ^1 [4 y. e% {0 r" S: k
return 0;}
( ?( p, Y8 @5 c! w( X9 aC99 标准里面的可变长数组特性,它允许数组在运行时才确定大小,尤其是在处理大小不确定的数据集时,可变长数组(VLA)为程序员提供了更大的灵活性。& E1 X Z7 v5 w w- L/ k5 m
使用可变长数组(VLA)的优势:
9 m. f3 A% h& Q% x1、动态分配大小:使用可变长数组,可以根据实际需要,在程序运行时分配数组的带下,在处理不确定大小的数据集时,非常有用。
" j, a% E* G4 Y- k& _( M4 W* c' C! _2、减少内存浪费:由于可变长数组是运行时才确定其大小的,因此可以避免在编译时分配固定内存,造成内存浪费。
) A' m# @* o; x8 [4 R但是,可变长数组(VLA)这种特性有利也有弊,在使用的时候需要注意一些潜在的问题。3 H$ ~4 ]- H! s+ c, G2 D
使用可变长数组的注意事项:& X6 B+ u) H# K6 e, u
1、编译器兼容问题:不是所有的编译器都支持 C99 标准里面的VLA特性,并且可能需要特定的编译器标志位来启用。2 d4 Q. n- g* S
2、程序可移植性:VLA特性在 C11 标准里面已经被进行标记,可能会在未来的 C 语言标准中移除,因此需要注意代码的可移植性。5 R9 g- g: T" A3 k/ I6 p3 W. }1 N
3、栈溢出风险:VLA在程序运行时分配数组空间大小,其位于内存的栈区域,使用不当可能会导致栈溢出。
' |; T' b/ s6 a4、性能优化问题:编译器可能无法对VLA进行优化,其代码性能可能不如静态分配数组或使用malloc分配内存。
1 M# _! ~' ]) M- K9 w$ L总的来说,可变长数组(VLA)特性,在编译时不确定数组大小,而是在程序运行时才确定,在使用时需要权衡其优缺点,并且注意潜在的风险。在某些情况下,使用VLA特性与动态内存 malloc 分配,可能会是一个不错的选择。
* `0 c$ x* C9 k5 ^, N8 B/ E) P-END-
+ s5 e+ S* \& |. N. E往期推荐:点击图片即可跳转阅读2 S- m7 r8 V0 V8 h; Y
1 Y8 R1 f/ I2 c7 T# V; ^1 T9 p6 O
4 H% | o9 O* v; U8 l
; I" {5 Q5 W+ i: f1 B
# }% E+ T8 S7 o# l
is5idenakul6402859128.jpg
! N/ E5 M0 A5 Y% Z1 R1 o, v
* ]0 u2 ^/ K" e$ K T 嵌入式物联网开发,搭建属于自己的云服务器9 Q% }* P( L2 X) b6 t
# ?2 D+ h/ g( E. X % N0 [9 b0 J* f- J
" t- y- x4 J& b9 ~ 8 U/ @* N% H: T, w* {; e* ^8 p
cdesh13mmuq6402859228.jpg
+ h/ Q2 ~. o% }, S$ W4 z
7 \, {6 D7 y- F1 D1 Z6 {5 v/ \+ V 嵌入式处理器芯片,已经进入了高算力时代!- D, ^" \% b- ]: d0 V# \
4 l5 P9 f: \7 K h; U( V ) o- k1 _4 E9 O& Q" K4 h
% L% d) l1 n& I+ w* q
1zm0cz4am3u6402859328.jpg
. c2 a# r$ h% x, I; r( ?4 ?
5 J( h8 O! K1 b; j
星闪,一项迫于无奈的创新技术!
6 x+ P7 L% E/ W- L3 @2 v& \ 0 _& l8 [8 M9 x1 E2 y( h
; | c* W' i4 i
& k) o- ]% |4 [0 [# r! z# I* k 我是老温,一名热爱学习的嵌入式工程师
- o. F; i/ P0 y$ U! m9 x0 H关注我,一起变得更加优秀! |
|