C中的数组声明

时间:2012-04-03 13:11:15

标签: c arrays

如何使用函数的参数在函数内声明一个数组?

我的代码是:

double function_2(int a)
{
  int t[a];
}

发生错误:

Expression must have a constant value.

6 个答案:

答案 0 :(得分:6)

您的代码是完全有效的C代码。

您使用的是VLA(可变长度数组)。这是一个c99功能,您必须确保您的编译器支持c99代码。

如果您使用的是gcc,则默认情况下gcc设置为-std=gnu89,即C89 + GNU扩展名。使用-std=c99-std=gnu99gcc一起编译您的程序。

如果您使用的是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
  • ,确保将代码编译为C语言
  • 由于我之前所说的不支持可变长度数组,因此您必须使用动态方法(见下文)。

使用动态分配来完成与您尝试的相同的操作:

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;
}