|

我是老温,一名热爱学习的嵌入式工程师
r; S( F( \/ E6 y关注我,一起变得更加优秀!, G; @) n8 m4 R
我们在编写 C 语言程序的时候,如果使用的编译器只支持 C89 标准,那么,在定义数组的时候,数组长度必须确定,例如:int arr[10],因为数组是静态分配内存的,所以数组的长度必须要在编译时进行确定。
( D# `3 ~, N& X/ O4 \0 k3 R当然,我们也可以采用指针变量和动态内存分配的方式,来模拟动态数组的行为,可以使用 malloc 或者 calloc 相关的函数,在程序运行时进行动态内存分配。
0 v( v3 U9 w6 h" [0 D示例代码如下:#include #include
* M9 |1 a/ e9 L. Z! M+ {int main() { int *arr = NULL; int n = 10; // 动态分配数组 arr = (int *)malloc(n * sizeof(int));! h9 O# O# V d, X
if (arr == NULL)return -1; // 使用数组 for (int i = 0; i arr = i; }1 ?, S& ^2 ~6 |' F
// 打印数组内容 for (int i = 0; i printf("%d \mn ", arr); }1 Y# S( g) t$ ?" G& K7 m
// 释放内存 if(NULL != arr)free(arr);
% n. ~. {/ @- b/ s+ E5 j: v% M return 0;}* s0 x/ X& X0 |# Y& y4 r
然而,除了使用 malloc 来模拟实现动态数组的功能之外,在 C 语言的 C99 标准里面,还引入了可变长数组(VLA)的概念,也就是说,可以允许数组的长度在程序运行时进行确定。. x' A7 B) b8 ]
示例代码如下: #include
5 W% c! m2 i* Aint main() { int n = 0; printf("Enter the number of elements: "); scanf("%d", &n);
3 D1 K. w V7 z$ G7 {7 |) L // 创建一个VLA int arr[n];
0 i- ?, N* V. L8 N // 使用VLA for (int i = 0; i arr = i * i; }% u3 ~& z/ `/ ]0 l
// 打印数组内容 for (int i = 0; i printf("%d \mn", arr); }
7 K: H% t w, s5 y9 a return 0;}2 T) V z9 l! `7 r& O0 ]: H
C99 标准里面的可变长数组特性,它允许数组在运行时才确定大小,尤其是在处理大小不确定的数据集时,可变长数组(VLA)为程序员提供了更大的灵活性。
q- s* a$ I* T; ^) r6 J3 Z! g. q使用可变长数组(VLA)的优势:8 \& \) W/ N+ O) L& i( U* O( Q
1、动态分配大小:使用可变长数组,可以根据实际需要,在程序运行时分配数组的带下,在处理不确定大小的数据集时,非常有用。
4 S1 m1 e+ h7 T6 J" Z2、减少内存浪费:由于可变长数组是运行时才确定其大小的,因此可以避免在编译时分配固定内存,造成内存浪费。
1 E% F$ O+ x0 Y7 ?/ U; U0 O# s但是,可变长数组(VLA)这种特性有利也有弊,在使用的时候需要注意一些潜在的问题。1 P: V8 `5 d* ~- H
使用可变长数组的注意事项:( p+ C0 B; Z4 @/ V
1、编译器兼容问题:不是所有的编译器都支持 C99 标准里面的VLA特性,并且可能需要特定的编译器标志位来启用。5 m! |) ~- v/ i) m2 t; r
2、程序可移植性:VLA特性在 C11 标准里面已经被进行标记,可能会在未来的 C 语言标准中移除,因此需要注意代码的可移植性。
) V {5 J- {7 Y: D* M& h+ v3、栈溢出风险:VLA在程序运行时分配数组空间大小,其位于内存的栈区域,使用不当可能会导致栈溢出。3 J) F% W( l( Y! k7 w( z) e
4、性能优化问题:编译器可能无法对VLA进行优化,其代码性能可能不如静态分配数组或使用malloc分配内存。
6 A$ j& Q* K3 m* O总的来说,可变长数组(VLA)特性,在编译时不确定数组大小,而是在程序运行时才确定,在使用时需要权衡其优缺点,并且注意潜在的风险。在某些情况下,使用VLA特性与动态内存 malloc 分配,可能会是一个不错的选择。
- F7 | O5 X. r: T5 a1 Y3 V-END-' ^- Z w! \7 i, w
往期推荐:点击图片即可跳转阅读 u8 I) T8 F8 p2 T- ^
4 b/ R' v! U$ \; z( O
7 S3 X0 C" c, k
6 g; b+ `5 e8 @ . B% A2 @- r; u% Q* M$ F7 l
gxnstklkcyn6406509924.jpg
0 y4 q$ [- k2 t9 T2 s
3 \8 D8 A4 N9 { 嵌入式物联网开发,搭建属于自己的云服务器+ j B- h7 O* R
& i' B% y+ ]3 N. b- R 5 N# Y2 `! }- A; a
4 ?4 ~4 O B: y6 o/ o# r4 T $ R# I! u; |8 k
r3tl1v0qocu6406510024.jpg
! J7 |' T8 M# g7 I ; a/ F' ?7 @) Y# `. H
嵌入式处理器芯片,已经进入了高算力时代!! r: s k/ `( x; z- G9 [# o+ P# k
2 u6 d2 I. N4 J
" ?* t6 c7 M2 ^: r& ~! r * {+ h8 y8 o; }# U9 D# N
c1dk2l4l4zk6406510124.jpg
1 S2 O0 m5 Y$ {5 E3 a' E
$ u- _! k7 v% {: K9 D8 M) Q6 t O. `$ G 星闪,一项迫于无奈的创新技术!; A% |8 x% r7 D# y" b8 A
4 i/ v) O# E F3 H6 Y2 M- z
+ |6 v& p, F3 M
& y3 F% W: _& Q3 x/ S2 `5 }' q 我是老温,一名热爱学习的嵌入式工程师
! ]4 x* d0 X9 P6 ?( d关注我,一起变得更加优秀! |
|