分享

C语言——可变长度数组(VLA)

 西北望msm66g9f 2023-10-06 发布于山东

图片

前段时间实验室开始招收新生,在新生群里总是出现一个情况,他们在写C语言的时候会使用变量作为数组长度。系统性的学过C语言的同学都明白,变量作为数组长度的做法是非法的,而且在如VS等编译器中均会报错。

图片

但是学弟学妹们在DEV中这样子却可以的,使用变量作为数组编译和运行均没有问题,所以我不经思考这个问题。

就如这篇公众号所说,栈区数据是由系统分配的,而我们的数组属于栈区数据,会在代码运行前就申请好空间,所以不应该会出现这种情况

电路小白,公众号:实在太懒于是不想取名C语言——动态内存分配

图片


可变长度数组  VLC
后来查阅许多资料后得知,这种现象叫做可变数组长度Variable Length Arrays)
有些编译器支持VLC,而有些编译器则不支持VLC,查阅资料得知从C99开始支持VLC,C90是不支持VLC的,并且VLC并不属于C语言标准的。
VLC是将栈区申请空间延迟到了代码运行后,本质还是在开辟栈区空间,并且在代码结束后(如函数运行结束后被释放)。
因此使用VLC和前文提到的动态内存分配有利有弊。
虽然使用VLC可以节省时间,但是VLC的生命周期短,在代码结束后即被释放,并且由于空间位于栈区会占用栈区空间可能会导致栈溢出等错误。
如下图所示,在输入变量过大,或者变量为0或者负数时即会导致程序崩溃

图片

因此真正的需要使用动态内存分配应尽量使用malloc函数来实现动态内存分配如下:
#include <stdio.h>#include <stdlib.h>
int main() { int m; printf('请输入长度:'); scanf('%d', &m); if (m <= 0) { printf('长度必须是正整数\n'); return 1; // 以错误代码退出 }
int *a = (int *)malloc(m * sizeof(int));
if (a == NULL) { printf('内存分配失败\n'); return 1; // 以错误代码退出 }
printf('长度为:%d\n', m);
// 使用完分配的内存后不要忘记释放它。 free(a);
return 0;}
因此在实际的使用过程中,应该尽量避开VLC的使用,使用标准C语言规范代码,提高代码的可用性。
除此之外,由于前文提到VLC只是将代码的栈区申请延迟到了代码运行后,在调用结束时释放,因此VLC是不能应用在全局区,其只能在函数内部使用。

图片

而且我在测试const的时候发现,这不对啊,被const修饰的变量居然在这可修改。

图片

图片

下期预告——const常量修饰符

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多