在运行时设置数组大小

时间:2013-01-12 17:16:21

标签: c arrays gcc c99

我知道如何在函数内创建结构数组:

typedef struct item
{
    int test;
};

void func (void) 
{
    int arraysize = 5;
    item ar[arraysize];  
}

但是,如果全局声明数组,我该怎么做?

typedef struct item 
{
    int test; 
};

item ar[];

void func (void)
{
    int arraysize = 5;
    // What to here?
}

5 个答案:

答案 0 :(得分:3)

对于具有自动存储持续时间的阵列,只允许在C中使用可变长度数组。在文件范围声明的数组具有静态存储持续时间,因此不能是可变长度数组。

您可以使用malloc为编译时大小未知的数组对象动态分配内存。

答案 1 :(得分:1)

你可能喜欢这个:

typedef struct item 
{
    int test; 
};

item *arr;

void func (void)
{
    int arraysize = 5;
    arr = calloc(arraysize,sizeof(item)); 
     // check if arr!=NULL : allocation fail!
     // do your work 

    free(arr);
}

但它的动态分配!

如果在编译时知道arraysize 。然后更好地创建一个像这样的宏:

#define arraysize  5

typedef struct item 
{
    int test; 
};

item arr[arraysize];  
对于宏常量使用大写的

侧注是好习惯

答案 2 :(得分:1)

item * ar:
int count;

void foo()
{
    count = 5;
    ar = malloc(sizeof(item) * count);
    // check to make sure it is not null...
}

答案 3 :(得分:1)

typedef struct item 
{
    int test; 
};

#define ARRAYSIZE 5

item ar[ARRAYSIZE];

答案 4 :(得分:0)

您无法在运行时修改数组的大小。您可以执行动态内存分配,并在需要时调用realloc()

编辑:在您的情况下,我建议做一些像这样的事情:

item *ar;

    void func(void)
    {
      int arraysize = 5;
      ar = malloc(arsize);
      if(ar) {
      /* do something */
     }
     //don't forget to free(ar) when no longer needed
    }