-2

このコードでこのエラーが発生する理由がわかりません。私は何をすべきか?エラーは次のとおりです。

柔軟な配列メンバーの無効な使用

この行で:

new_buffer->array_msg =array;

ここにコードのより大きなセクションがある場合:

   typedef struct buffer {
    int size;
    int T;
    int D;
    int msg_presenti;

    pthread_cond_t not_full;
    pthread_cond_t not_empty;
    pthread_mutex_t mutex;
    msg_t * array_msg[];

} buffer_t;

buffer_t * buffer_init(unsigned int maxsize){
    buffer_t * new_buffer = malloc( sizeof(buffer_t) + maxsize * sizeof(msg_t) );

    msg_t * array[maxsize];
    new_buffer->array_msg =array;
    new_buffer->size=maxsize;
    return new_buffer;
}
// deallocazione di un buffer
4

1 に答える 1

2

この行は、構造体と柔軟な配列メンバーの両方にスペースを割り当てるのに十分です。

buffer_t * new_buffer = malloc( sizeof(buffer_t) + maxsize * sizeof(msg_t *) );
                                ^                  ^
                                1                  2

1構造体にメモリを割り当て、柔軟な配列メンバー2にスペースを割り当てるため、関数は次のようになります。

buffer_t * buffer_init(unsigned int maxsize)
{
    buffer_t * new_buffer = malloc( sizeof(buffer_t) + maxsize * sizeof(msg_t) );

    new_buffer->size=maxsize;
    return new_buffer;
}

ドラフト C99 標準セクション6.7.2.1構造体および共用体指定子の段落17を見ると、次の例が示されています。

例 宣言の後:

struct s { int n; double d[]; };

構造体 structsには柔軟な配列メンバーがありdます。これを使用する典型的な方法は次のとおりです。

int m = /* some value */;
struct s *p = malloc(sizeof (struct s) + sizeof (double [m]));

mallocへの呼び出しが成功すると仮定すると、が指すオブジェクトは、ほとんどの場合、次のように宣言されているpかのように動作します。p

struct { int n; double d[m]; } *p;

(この同等性が破られる状況があります。特に、 member のオフセットがd同じではない可能性があります)。

于 2013-11-27T16:35:39.837 に答える