1

是否可以初始化可变大小的对象,例如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;
}
4

5 回答 5

3

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

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

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

于 2013-08-08T14:34:54.523 回答
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;
}
于 2013-08-08T14:36:44.957 回答
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
于 2013-08-08T14:43:45.190 回答
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;
}
于 2013-08-08T14:39:19.663 回答
-1

您不能在运行时在 C 中初始化数组,因为编译器必须提前(在堆中)为此语法保留空间。

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

于 2013-08-08T14:32:32.923 回答