例如说我有一个返回6
的函数,我可以使用该函数来定义一个新的数组吗?
int array[funct(x)];
答案 0 :(得分:2)
可变长度数组在C99标准中有效。可以按照您描述的方式在函数内声明数组。
#include <stdio.h>
int func(void)
{
return 6;
}
int main(void)
{
int arr[func()];
arr[0] = 0;
arr[1] = 1;
arr[2] = 2;
arr[3] = 3;
arr[4] = 4;
arr[5] = 5;
printf("%d, %d, %d, %d, %d, %d\n",
arr[0], arr[1], arr[2], arr[3], arr[4], arr[5]);
}
即使使用-Wall
和-Wextra
,该编译也不会发出任何警告。
$ gcc text.c -Wall -Wextra
$ ./a.out
0, 1, 2, 3, 4, 5
没问题。请务必通过Wikipedia page on variable-length arrays。
如果您想控制内存使用并熟悉动态内存分配,也可以使用动态内存分配。如果我没记错的话,如果在编译时不知道数组大小,则会执行某种形式的动态内存分配。
#include <stdio.h>
#include <stdlib.h>
int func(void)
{
return 6;
}
int main(void)
{
int *arr;
arr = malloc(func() * sizeof *arr);
arr[0] = 0;
arr[1] = 1;
arr[2] = 2;
arr[3] = 3;
arr[4] = 4;
arr[5] = 5;
printf("%d, %d, %d, %d, %d, %d\n",
arr[0], arr[1], arr[2], arr[3], arr[4], arr[5]);
free(arr);
}
这也是有效的。输出是相同的。
答案 1 :(得分:1)
测试代码:
#include <stdio.h>
#include <stdlib.h>
unsigned int func(void) {
return(6);
}
int main(int argc, char *argv[]) {
unsigned int len = func();
int array[len];
printf("func() returns %u, array size is %ld bytes with %ld elements\n",
len, sizeof(array), sizeof(array)/sizeof(*array));
return(0);
}
输出:
$ gcc -Wall -o dummy dummy.c
$ ./dummy
func() returns 6, array size is 24 bytes with 6 elements
YMMV,例如
$ gcc -Wall -Wc90-c99-compat -o dummy dummy.cdummy.c: In function ‘main’:
dummy.c:10:3: warning: ISO C90 forbids variable length array ‘array’ [-Wc90-c99-compat]
int array[len];
^~~
$ gcc -Wall -Wc99-c11-compat -o dummy dummy.c
$