2016-10-05 16 views
3

intの配列を含む構造体を構造体の配列に割り当てる方法を知りたいと思います。私が考えている新しいソリューションに関係なく、誤った結果を得ています。構造体の配列にintの配列を含む構造体を正しく割り当てるにはどうすればよいですか?

私はこの問題は、コードのこの部分にあると考えている:

struct Codes *create(int as) { 
    struct Codes *c = malloc(sizeof (struct Codes)+as * sizeof (int)); 
    c->as = as; 
    for (int i = 0; i < as; i++) { 
     c->a[i] = i; 
    } 

    return c; 
} 

全体コード:

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 

struct Codes { 
    int as; 
    int a[]; 
}; 

struct Code { 
    int as; 
    struct Codes *ci[]; 
}; 

struct Codes *create(int as) { 
    struct Codes *c = malloc(sizeof (struct Codes)+as * sizeof (int)); 
    c->as = as; 
    for (int i = 0; i < as; i++) { 
     c->a[i] = i; 
    } 

    return c; 
} 

struct Code *and(int as, struct Codes *cd) { 
    struct Code *c = malloc(sizeof (struct Code)+as * sizeof (struct Codes)); 
    for (int i = 0; i < as; i++) { 
     c->ci[i] = cd; 
    } 
    c->as = as; 
    return c; 
} 

int main(int argc, char **argv) { 

    struct Codes *cd; 
    cd = create(4); 

    struct Code *c; 
    c = and(2, cd); 

    for (int i = 0; i < c->as; i += 1) { 
     for (int j=0; j < c->ci[i]->as; j++) { 
      printf("%d \n", c->ci[i]->a[j]); 
     } 
    } 

    free(cd); 
    free(c); 

}//main 

実際の結果:

0 
1 
2 
3 

期待される結果:

0 
1 
2 
3 
0 
1 
2 
3 
+1

デバッガの使い方を学び、プログラムの実行中に変数の値を調べることで、これらのことを自分で見つけることができればよいでしょう –

+0

そのことについては残念ですが、助けを求めて –

答えて

1

struct Code *c = malloc(sizeof (struct Code)+as * sizeof (struct Codes));が間違っています。 struct Codeのciはポインタの配列ですが、構造体の配列のためのスペースが割り当てられています。また、for (int j;for (int j = 0;あるべき

struct Code *c = malloc(sizeof *c + as * sizeof c->ci[0]); 

:どちらか、この問題を解決sizeof(struct Codes *)に変更、または好ましくために、あなたがスペースを割り当てているタイプへのポインタを参照解除のパターンを使用するには

。あなたのコードは、初期化されていない値jを使用して未定義の動作を引き起こします。 gccフラグ-Wextraを使用すると、このエラーが診断されました。

関連する問題