7

char fl[1]次のコード スニペットのような例をいくつか見ました。そのような構造が何に使用される可能性があるのか​​、私には推測できません。

struct test
{
    int i;
    double j;
    char fl[1];
};

int main(int argc, char *argv[])
{
    struct test a,b;
    a.i=1;
    a.j=12;
    a.fl[0]='c';

    b.i=2;
    b.j=24;
    memcpy(&(b.fl), "test1" , 6);
    printf("%lu %lu\n", sizeof(a), sizeof(b));
    printf("%s\n%s\n",a.fl,b.fl);
    return 0;
}

出力 -

24 24 
c<some junk characters here>
test1
4

3 に答える 3

7

これは「構造体ハック」と呼ばれ、 C FAQで読むことができます。一般的な考え方は、リストされている構造体に必要なメモリよりも多くのメモリを割り当て、最後に配列の長さが 1 より大きいかのように使用することです。

ただし、C99+ の柔軟な配列メンバーに置き換えられたため、このハックを使用する必要はもうありません。

于 2013-01-30T16:46:02.720 に答える
0

アイデアは通常、ソケットから読み取られるパケットのように、可変サイズのデータ​​に名前を付けることです。

struct message {
    uint16_t len; /* tells length of the message */
    uint16_t type; /* tells type of the message */
    char payload[1]; /* placeholder for message data */
};

次に、バッファーをそのようなにキャストstructし、配列メンバーにインデックスを付けてデータを操作します。

于 2013-01-30T16:49:52.373 に答える
0

あなたが書いたコードは、触れてはいけないメモリを上書きしていることに注意してください。はmemcpy()、1 つの文字配列に複数の文字を書き込んでいます。

これの使用例は、多くの場合、次のようになります。

struct test *obj;
obj = malloc(sizeof(struct test) + 300); // 300 characters of space in the
                                         // flexible member (the array).
obj->i = 3;
obj->j = 300;
snprintf(obj->f, 300, "hello!");
于 2013-01-30T16:51:18.787 に答える