C 语法求介绍

2014-05-16 16:40:18 +08:00
 danny106
本来:
印象当中是不能这样写的:
int iVar = 5;
char *content[iVar];
应该:
int iVar = 5;
char **content = (char**)malloc(sizeof(char*)*iVar);
但是:
我已经发现好几个开源代码都是直接 char *content[iVar];
到底是个什么情况,求解释
2685 次点击
所在节点    问与答
13 条回复
leavic
2014-05-16 16:48:12 +08:00
你printf看一下content的长度
leavic
2014-05-16 16:50:25 +08:00
我感觉content是一个指向指针的指针,而不是一个数组,所以不需要分配空间.
aszxqw
2014-05-16 16:50:38 +08:00
编译器在作怪。
jkneedout
2014-05-16 16:53:50 +08:00
#define iVar 5
顺便贴下你看到的开源代码地址吧
leavic
2014-05-16 16:55:47 +08:00
啊,我想起来了,这种用法我也写过,我是直接char Buff[200],不需要Malloc.
直接写char *content[iVar]是可以自动分配空间的,但在这个函数结束之后,这部分内存会被回收,而且你无法在定义他的函数之外访问它,malloc的意义是建立一个可以被公共访问的指针,如果你只在一个函数内使用这个数组,用完就不管,是可以不用malloc的.
而且,有些时候其实你没法控制这个数组的消亡时间,不知道在什么地方去free他,用malloc反而会造成内存无法回收.
leavic
2014-05-16 16:57:14 +08:00
至于建立数组的时候,长度不能是变量只能是常量的问题,我只能说是编译器的问题,有些编译器现在真的可以支持变量做长度.
mulog
2014-05-16 16:58:31 +08:00
C99

https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html

Variable-length automatic arrays are allowed in ISO C99, and as an extension GCC accepts them in C90 mode and in C++. These arrays are declared like any other automatic arrays, but with a length that is not a constant expression. The storage is allocated at the point of declaration and deallocated when the block scope containing the declaration exits
LMkillme
2014-05-16 17:02:23 +08:00
可以这样写,C99支持的,初始化时就决定数组大小了,之后你改变ival的值也不行。
LMkillme
2014-05-16 17:02:52 +08:00
gcc支持,g++不支持
chchwy
2014-05-16 17:39:19 +08:00
C99最新的標準, 另外這是C跟C++不相容的地方。
danny106
2014-05-16 17:40:35 +08:00
ChiangDi
2014-05-16 17:55:35 +08:00
VLA,好像叫变长数组。
sandtears
2014-05-16 18:36:35 +08:00
这不就是 C99 标准么,C99 允许直接用变量定义数组长度。

如果你用的 gcc, 那么编译的时候指明 `-std=c99` 就行了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/112862

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX