我最近尝试过这个实验,其中我没有为未知大小的内存需求进行动态内存分配,而是进行了静态分配。当我声明数组a[i]
时,我保持i
(数组的大小)变量并且取决于用户给出的输入。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
void function(int );
int main(void)
{
int i;
printf("Enter:");
scanf("%d",&i);
function(i);
printf("i = %d\n",i);
getch();
return 0;
}
void function(int i)
{
char a[i];
char b[4];
strncpy(a,"hello",i);
strcpy(b,"world");
int j = 0;
char *c = a;
for( j = 0; j< 20; j++ )
printf("%c",*c++);
}
我的问题是:
答案 0 :(得分:14)
这样的手术合法吗?
它被称为可变长度数组。
VLA在ANSI C99中是合法的,并且是一些C99前编译器的扩展。 GCC支持严格的C99和非C99代码的扩展。它在C ++ 0x中也是合法的。
如果不是,为什么编译器不发出任何警告或错误?
使用gcc:
$ gcc -std=c89 src/vla.c -Wall -ansi -pedantic
src/vla.c: In function ‘function’:, not dynamic array.
src/vla.c:17: warning: ISO C90 forbids variable length array ‘a’
src/vla.c:21: warning: ISO C90 forbids mixed declarations and code
MSDOS中'conio.h'的存在表明您可能正在使用Microsoft Visual C ++编译器,因此不必担心。 MS一直致力于使他们的编译器更符合C ++ 0x标准,但没有声明它的C编译器模式是如何标准的。你问为什么西班牙方言词不在法语词典中。
这个内存将分配到哪里:堆栈还是堆?
它是一个自动对象,因此出于效率原因,大多数C实现都会放入堆栈中。
为什么ANSI C / GCC允许这样做
在运行时创建可变大小的临时数组非常有用,它的生命周期不会延伸到函数调用之外。
答案 1 :(得分:10)
答案 2 :(得分:1)
这是合法的,但并非所有编译器都支持它。至少Visual Studio&lt; = 2003 afaik不支持它。
我认为它不是Ansi C ++,请尝试gcc -ansi -pedantic。
答案 3 :(得分:0)
可变长度数组在ANSI C(C89)中是非法的。尝试提高编译器的警告级别,我确定你会收到警告/错误。
答案 4 :(得分:0)
代码有效,但在使用可变长度数组时要记住一件事。
void function(int i)
{
int a[i];
.
.
}
这里没有错误检查。 <{1}}过大时,此代码可能会失败。
答案 5 :(得分:0)