C 语言 静态数组

2014-07-25 20:35:01 +08:00
 gejigeji
为什么这么写也是合法的?

#include <stdio.h>

int main(){
int n;
scanf("%d", &n);
char test[n];
return 0;
}

在栈上分配内存不是应该要固定长度吗?

Linux GCC
2736 次点击
所在节点    程序员
7 条回复
messense
2014-07-25 20:40:41 +08:00
bombless
2014-07-25 22:33:51 +08:00
可变数组…等哪天你需要换vs编译就知错了…
dorentus
2014-07-25 22:42:07 +08:00
ffffwh
2014-07-25 23:15:02 +08:00
我在思考为什么原来(或VS中)不可以:
比方说这样
>>>>
int a;
int b[...];
int c;
<<<<
变量的地址(即相对于栈指针的偏移)在编译时都应该是确定的。如果允许b长度不确定,那么就无法确定c的地址。

我想问:
请问是这么回事么?
新实现(C99)里是如何实现可变数组的呢?
paulw54jrn
2014-07-25 23:27:42 +08:00
搬运工
http://stackoverflow.com/questions/21182307/how-does-gcc-implement-variable-length-arrays

Here's the allocation code (x86 - the x64 code is similar) for the following example line taken from some GCC docs for VLA support:

char str[strlen (s1) + strlen (s2) + 1];
where the calculation for strlen (s1) + strlen (s2) + 1 is in eax (GCC MinGW 4.8.1 - no optimizations):

mov edx, eax
sub edx, 1
mov DWORD PTR [ebp-12], edx
mov edx, 16
sub edx, 1
add eax, edx
mov ecx, 16
mov edx, 0
div ecx
imul eax, eax, 16
call ___chkstk_ms
sub esp, eax
lea eax, [esp+8]
add eax, 0
mov DWORD PTR [ebp-16], eax
So it looks to be essentially alloca().
gejigeji
2014-07-29 18:54:11 +08:00
@dorentus 可是我 gcc -std=c89 test.c 照样可以通过~
gejigeji
2014-07-29 19:03:42 +08:00
@dorentus 不管了 看别人代码里这么用的 我是不会这么用

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

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

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

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

© 2021 V2EX