我可以使用函数在C中定义数组的长度吗?

时间:2019-01-28 06:28:14

标签: c

例如说我有一个返回6的函数,我可以使用该函数来定义一个新的数组吗?

int array[funct(x)];

2 个答案:

答案 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
$