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

但是学弟学妹们在DEV中这样子却可以的,使用变量作为数组编译和运行均没有问题,所以我不经思考这个问题。
就如这篇公众号所说,栈区数据是由系统分配的,而我们的数组属于栈区数据,会在代码运行前就申请好空间,所以不应该会出现这种情况

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

因此真正的需要使用动态内存分配应尽量使用malloc函数来实现动态内存分配如下:
#include
#include
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修饰的变量居然在这可修改。



登录 或 注册 后才可以进行评论哦!
还没有评论,抢个沙发!