如何初始化一个可变大小的对象

时间:2013-08-08 14:28:52

标签: c variables initialization

是否可以初始化像struct IP_addresses ip_addr[no_of_users] below这样的可变大小的对象?

void foo(int no_of_users){
    struct IP_addresses{
       char IPaddr[16];
    };
    struct IP_addresses ip_addr[no_of_users];
    //.....
}

int main(void){
    int no_of_users = 4;
    foo(no_of_users);

    return 0;
}

5 个答案:

答案 0 :(得分:3)

您无法初始化可变长度数组。从C 2011(N1570)6.7.9,“初始化”,第3段:

  

要初始化的实体的类型应为未知大小的数组或不是可变长度数组类型的完整对象类型。

您必须通过其他方法为数组赋值,例如为每个元素分配一个循环。

答案 1 :(得分:2)

如果您的意思是分配/声明可变大小的对象,那么在现代C编译器中 本地动态变量 >。这是因为所有编译器要做的就是碰撞堆栈指针,以便在进入函数时为本地变量腾出空间,所以到那时它就知道参数no_of_users的值。

它通常适用于static个变量,因为它们不会存在于堆栈中,而是在调用函数之前设置。

如果在编译时不知道要分配多少个,那么编译器需要分配的任何变量也不起作用。例如:

static unsigned int no_of_users = 10;
static char var[no_of_users];

int main(void){
    return 0;
}

不起作用,但这会:

#define no_of_users 10

static char var[no_of_users];

int main(void){
    return 0;
}

答案 2 :(得分:1)

使用gcc编译3.4.4工作正常。

但是,它可以工作,因为这是堆栈上的局部变量。正如sh1ftst0rm指出的那样,它不适用于静态/全局变量。

#include <stdio.h>
#include <stdlib.h>

void tester(int n)
{
    int sz[n];
    int i;
    for(i = 0; i < n; i++)
        sz[i] = 0;
}

int main()
{
    tester(5);

    return 0;
}

答案 3 :(得分:1)

以下代码编译并使用gcc 4.4.5。

#include <stdlib.h>
#include <stdio.h>

void foo(int no_of_users)
{
    struct IP_addresses
    {
        char IPaddr[16];
    };
    struct IP_addresses ip_addr[no_of_users];
    int i;

    for(i = 0; i < no_of_users; i ++)
        sprintf(ip_addr[i].IPaddr, "test%02d", i);

    for(i = 0; i < no_of_users; i ++)
        printf("%s\n", ip_addr[i].IPaddr);
}

int main(int argc, char **argv)
{
    int i, no_of_users;

    for(i = 1; i < argc; i ++)
    {
        no_of_users = strtol(argv[i], 0, 10);
        foo(no_of_users);
    }

    return 0;
}

我不确定这些标准是什么意思,但在实践中,它只是起作用。以下是我得到的结果:

$ gcc -o ./test ./test.c
$ ./test 3 4 5
test00
test01
test02
test00
test01
test02
test03
test00
test01
test02
test03
test04

答案 4 :(得分:-1)

您无法在运行时期间在C中初始化数组,因为编译器必须事先为此语法保留空间(在堆中)。

您必须使用动态分配(malloc和free)。