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 コンパイラでははい、ローカルの動的変数が可能です。これは、コンパイラが関数に入るときにスタック ポインタをバンプして、ローカル vars 用のスペースを確保するだけなので、その時点でパラメータの値を認識しているためです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 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

次のコードは、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

ランタイム中に C で配列を初期化することはできません。これは、コンパイラがこの構文のために事前に (ヒープ内に) スペースを予約する必要があるためです。

動的割り当て (malloc と free) を使用する必要があります。

于 2013-08-08T14:32:32.923 に答える