0

私は6レベルのネストされた構造を持っています。最後の 3 つのレベルに問題があります。プログラムは正常にコンパイルされますが、実行するとセグメンテーション違反でクラッシュします。私が感じているのは、割り当てにいくつかの問題があるということです。間違いを指摘してください。

typedef struct {
    char addr[6];
    int32_t rs;
    uint16_t ch;
    uint8_t ap;
} C;

typedef struct {
      C *ap_info;
} B;

typedef struct {
    union {
        B wi;
    } u;
} A;

function1(char addr , int32_t rs, uint16_t ch, uint8_t ap) {
    A la;
    la.u.wi.ap_info->addr[6] = addr;
    la.u.wi.ap_info->rs = rs;
    la.u.wi.ap_info->ch = ch;
    la.u.wi.ap_info->ap = ap;
}
4

2 に答える 2

1

が指す構造体にメモリを割り当てていないか、ポインタ自体la.u.wi.ap_infoを設定していません。la.u.wi.ap_info次のようなものが必要です:

la.u.wi.ap_info = calloc(1,sizeof(C)); // allocate a C instance and 
                                       //  point la.u.wi.ap_info at it

...free(la.u.wi.ap_info);構造体が不要になった後で。または、既存の構造体を指すこともできますが、それを指す構造体が、使い終わるまで存在することが保証されている場合に限ります。

さらに、次の行:

la.u.wi.ap_info->addr[6] = addr;

間違っています; 文字を配列の 7 番目の要素に割り当てますがaddr、これには 6 要素分のスペースしかありません (したがって、範囲外です)。addr構造体にコピーする文字列を意味する場合、その型はchar *notcharである必要があり、次のようなものが必要です。

strncpy(la.u.wi.ap_info->addr, addr, 5); // copy up to 5 chars
la.u.wi.ap_info->addr[5] = '\0'; // explicitly null the sixth char

単純な割り当ての代わりに。

于 2012-08-30T03:34:53.143 に答える
0

ポインタにメモリを割り当てていません

于 2012-08-30T02:25:46.553 に答える