如何使用函数的参数在函数内声明一个数组?
我的代码是:
double function_2(int a)
{
int t[a];
}
发生错误:
Expression must have a constant value.
答案 0 :(得分:6)
您的代码是完全有效的C代码。
您使用的是VLA(可变长度数组)。这是一个c99功能,您必须确保您的编译器支持c99代码。
如果您使用的是gcc
,则默认情况下gcc
设置为-std=gnu89
,即C89 + GNU扩展名。使用-std=c99
或-std=gnu99
与gcc
一起编译您的程序。
如果您使用的是MSVC,很遗憾它不支持c99,因此您无法在此编译器中使用c99功能。
修改强>
如果编译器不支持VLA,则可以使用动态内存分配:
#include <stdlib.h>
double function_2(int a)
{
// Allocate array object
int *t = malloc(a * sizeof *t);
if (!t) {
// Handle malloc errors
}
// Write your program here: ...
// Free array object
free(t);
}
答案 1 :(得分:2)
C99的variable length arrays扩展名。如果使用以下命令编译代码,它将起作用:
gcc -std=gnu99 lala.c -o lala
如果您使用的是VC ++,则不存在可变长度数组,因为它使用的标准是C89,具有C99的一些功能(不包括可变长度数组)。
由于您提到使用VC ++进行编译,我将添加一些注释:
.c
而不是.cpp
使用动态分配来完成与您尝试的相同的操作:
int * t = malloc(a * sizeof(int))
如果您正在使用动态分配并希望返回数组,则可以通过让函数返回int *
然后返回t
来执行此操作。但是,如果这样做,通常也会返回数组的长度(除非它是固定的已知长度)。用于返回此长度的常用技术是:
例如:
// Returns number of entries in the Lala array returned from b()
int GetNumLalaEntries(void);
// Function b which returns an array.
int * b(void)
{
int * lala = malloc(5 * sizeof(int *));
...
return lala;
}
在上述情况下,GetNumLalaEntries
总是返回5,但如果此数字是动态的,则需要从某些内部同步信息生成。
例如:
// We are passing in the array this time.
void b(int * lala)
{
... // Do whatever you need with lala
}
int main(void)
{
int * lala = malloc(GetNumLalaEntries() * sizeof(int *));
b(lala);
return 0;
}
struct
而不是同时具有数组指针和数组大小。例如:
struct lala_encapsulation {
int * lala;
int lala_entries;
};
struct lala_encapsulation b(void)
{
struct lala_encapsulation le;
le.lala_entries = 5;
le.lala = malloc(le.lala_entires * sizeof(int *));
return le;
}
最后一个方法允许您通过将整个数组包装在可以按值返回的struct
中来返回整个数组。
答案 2 :(得分:1)
您无法直接分配。 你必须声明它是固定常数。
否则使用指针的概念。
答案 3 :(得分:1)
您应该使用内存分配而不是数组,而是像数组一样使用它进行迭代或其他用途。
答案 4 :(得分:1)
double function_2(int a)
{
int * t = (int*)malloc(sizeof(int)*a);
for(int i = 0; i<a; i++)
{
// do your work here, accessing t like an array
t[i]=...
}
free(t);
...
}
答案 5 :(得分:1)
你必须使用堆(malloc / free)
#include<stdlib.h>
double function_2(int a)
{
....
int *t = (int*) malloc (sizeof(int) *a);
t [1] = 1; // but check if array is large enough
...
free (t);
...
return 0.0;
}