菜鸟请教几个关于变长数组(VLA)的问题

hangonfeiyan 2012-10-08 12:40:03
1.为什么VS2010不支持C中的变长数组特性呢?有什么比较适合新手的支持VLA的IDE吗?

2.《C Primer Plus中文版》第五版P344中有一段话:
“一个区别在于VLA是自动存储的。自动存储的结果之一就是VLA所用内存空间在运行完定义部分之后会自动释放。……另一方面,使用由malloc()创建的数组不必局限在一个函数中。例如,函数可以创建一个数组并返回指针,供调用该函数的函数访问。”
我想知道,变长数组是否可以像malloc()创建的数组那样,先在函数A中创建,然后由函数A将数组名返回给调用它的函数B,这样就可以在函数B中存在,从而也可以“不必局限在一个函数中”呢?虽然VLA是自动存储的,但是自动存储类的变量只要有指针还在引用它,那么它的内存就不会释放呀。
譬如说,像这样实现两个矩阵相乘可以吗?:

int(*)[p] matrixMultiply(int m,int n,int k,int a[m][n],int b[n][p])
{
int i,j,k,c[m][p];
for(i = 0;i < m;i++)
{
for(j = 0;j < p;j++)
{
for(k = 0,c[i][j]=0;k < n;k++)
{
c[i][j] += a[i][kl * b[k][j];
}
}
}
return c;
}

3.VLA可否用在结构体的定义中?比如:

typedef struct VLA
{
int length;
int a[length];
} VLA;
这样可以吗?

4.下面这段代码中关于函数返回值类型的声明不对吗?为什么VS2010编译通不过呢?
int(*)[5] f()
{
int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}};

return a;

}
...全文
258 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hangonfeiyan 2012-10-11
  • 打赏
  • 举报
回复
自动存储类的变量只要有指针还在引用它,那么它的内存就不会释放。这句话对不对?
hangonfeiyan 2012-10-11
  • 打赏
  • 举报
回复
谢谢各位指点!但我还是不明白,如果不能用函数返回局部变量的地址的话,那么下面这段程序怎么可以运行呢?
#include "stdafx.h"


int* f()
{
int a[5] = {1,2,3,4,5};

return a;

}

int main()
{
int * b = f();
printf("%d",* b);
getchar();
}
结果显示1,这里函数f()不是把局部变量a[5]的地址返回给main()了吗?
还有就是:如果不用变长数组的话,C语言里头怎样对二维数组进行动态分配内存呢?变长数组是不是会对性能有妨害?
huangxy10 2012-10-08
  • 打赏
  • 举报
回复
2,你的c是用malloc申请的吗???它还是局部变量,当然不可以。
huangxy10 2012-10-08
  • 打赏
  • 举报
回复
4,你返回局部变量的地址,那是绝对错误的,f函数结束后,a的栈空间会释放,返回a的地址就是错误的。
Alexander 2012-10-08
  • 打赏
  • 举报
回复
1.VC只是增加了C-99中新增的数据类型long long和long double,其余C-99中的新特性都没有实现。

2.局部变量与malloc(动态内存分配)是本质上不同的。
局部变量存储在栈区的。高级语言里栈的管理是由编译程序完成的(过程开始时入栈,结束时出栈),程序员无法人为干涉。
动态内存分配使用的内存区域叫堆,是编译程序预留给程序员自由支配的内存区域。堆内存的管理(包括申请、使用、释放等)都是由程序员自己完成:与申请函数malloc对应的有释放函数free,与申请关键字new对应的有释放关键字delete。动态分配的内存作用域、生存期都是由程序员自己控制的。
飞天御剑流 2012-10-08
  • 打赏
  • 举报
回复
VS的C编译器是C90,不是C99,是不支持VLA的,支持C99的编译器可选择gcc或者comeau c等。

你的第二个问题是不行的,不应使用局部对象的指针。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧