• ベストアンサー

構造体で・・・・

構造体は配列を使用せずメモリ領域を獲得する関数を使用すること、 *構造体内部のメンバ名には配列を用いて良い。  という、条件があるのですが場合はどのようにすればよろしいでしょうか? どなたか教えてください。 構造体は以下のようになってます。 /*構造体の定義*/ struct seiseki{   char name[20];   int eig;   int suu;   int kok;   char rank[3]; };

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

struct seiseki *seisekip; seisekip = (struct seiseki*)malloc(n*sizeof(struct seiseki)); みたいにせよということだと思います。 n は、確保する個数 そうすれば、 struct seiseki a[n]; として配列で確保した場合と同じように seisekip[i]で使えます。

その他の回答 (10)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.11

> > 構造体は配列を使用せず > > とあることから、一度に複数の構造体を使用することも想定する必要があるのでは? はい。その辺りのことは私も他の方も承知かと思います。 要するに、質問には具体的なことが何も書かれていないので、単に要求された内容を満たすだけであれば、静的な記憶域を返すだけでもOKだと思ったわけです。 質問には、「配列を使うな」とは書いていますが、複数のオブジェクトが必要とは書いていません。 最もひねくれた回答をするなら、struct seisekiの配列をメンバに持つ構造体を宣言して、struct seiseki[]へのポインタを返してもよいわけです。

  • ency
  • ベストアンサー率39% (93/238)
回答No.10

横レスになってしまいますが。。。 質問者 zebrastarさんの記載内容に > 構造体は配列を使用せず とあることから、一度に複数の構造体を使用することも想定する必要があるのでは? No3 jactaさんのやりかたでそれを実現しようとすると、結局関数内で static な配列を使うしかないと思うのですが。。。 # その場合、配列のインデックスを含めて static にする必要がありますよね。 …見当はずれなことを書いていたらごめんなさい。。。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.9

> #3ってどういう使い方を想定してるんだろうか? 使い方といっても、 struct seiseki *p = seiseki(); strcpy(p->name, "abc"); p->eig = 80; ... /* free不要 */ しかないと思いますが... > こんな使い方するくらいなら、単純に変数を1個用意した方がいい。 直接宣言してしまうと、それこそ「獲得」ではなくなります。 題意では、「配列を使用しない」ことと「メモリ領域を獲得する関数を使うこと」だけが要求されています。その「メモリ領域」が静的なものか動的なものかまでは規定されていませんね。もし、所有権が完全に移らないことが問題であるなら、フラグを追加すれば済むことです。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.8

そうそう、獲得とは違う そもそも #3ってどういう使い方を想定してるんだろうか? こんな使い方するくらいなら、単純に変数を1個用意した方がいい。

回答No.7

ああ、構文的には正しいけれど、 「題意に沿っているか?」と問われれば「否」ですかね。

  • nk2
  • ベストアンサー率23% (6/26)
回答No.6

「メモリ領域を獲得する関数」 関数は振る舞いです。 振る舞いは動作です。 メモリを確保する動作を用いよ。 ということになりますから、 動的にメモリを確保せよ。ということでしょう。 static struct seiseki storage; ではリンクしたときにメモリ領域が確保されるので、 条件を満たしていないと思います。

回答No.5

あかんこたないでしょう、staticやし。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#3は、あかんやろ

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

struct seiseki *seiseki(void) {  static struct seiseki storage;  return &storage; } でも、メモリ領域を獲得する関数を使用したことになると思います。

回答No.2

> どのようにすればよろしいでしょうか? …なにを? (質問の仕方が下手!) struct seiseki table[N]; を struct seiseki* table = (struct seiseki*)malloc(sizeof(struct seiseki)*N); に置き換える、ということでしょうか? # 使い終わったらfreeを忘れずに

関連するQ&A