4

「mcguffins」と呼ばれる構造体の配列を作成していますが、非常に奇妙なエラーが発生します。

    //prints the info in a mcguffin 
    void printInfo(int i,struct mcguffin * new) {
      printf("%d \tNum: %d\t Word: %s\n", i, new->num, new->word);
    }

    //creates a new mcguffin
    struct mcguffin * addMG(int n, char * w) {
      printf("Expected output:\n\tNum: %d\tWord: %s\n", n, w);
      struct mcguffin * new;
      new = malloc(sizeof *new);
      new->num = n;
      strncpy(new->word, w, sizeof(char[20]));
      printf("Actual output: \n\t");
      printInfo(1, new);
      return new;
    }

//creates a list of mcguffin pointers, and sets these pointers to new mcguffins
struct mcguffin ** writeList() {
  struct mcguffin ** list = malloc(10 * sizeof(*list));
  list[0] = addMG(2, "Jeter");
  list[1] = addMG(14, "Granderson");
  list[2] = addMG(25, "Teixeira");
  list[3] = addMG(13, "Rodriguez");
  list[4] = addMG(24, "Cano");
  list[5] = addMG(33, "Swisher");
  list[6] = addMG(55, "Martin");
  list[7] = addMG(20, "Posada");
  list[8] = addMG(11, "Gardner");
  list[9] = addMG(42, "Mo");
  return list;
}

何らかの理由で、list[0]とlist[1]は作成された構造体に割り当てられていませんが、list[2]からlist[9]は割り当てられています。addMGは正常に動作し、list[0]とlist[1]の構造体を作成しますが、何らかの理由でそれらにprintInfoを使用しようとすると、構造体に情報を出力する代わりに、メモリアドレスを出力します。 > numは移動し、new->wordに対して何も出力しません。

0   Num: 30519472    Word: 
1   Num: 30519600    Word: 
2   Num: 25  Word: Teixeira
3   Num: 13  Word: Rodriguez
4   Num: 24  Word: Cano
5   Num: 33  Word: Swisher
6   Num: 55  Word: Martin
7   Num: 20  Word: Posada
8   Num: 11  Word: Gardner
9   Num: 42  Word: Mo

私はCを初めて使用するため、これはおそらくいくつかのばかげたエラーですが、助けていただければ幸いです。

編集:明確にするために、マクガフィンは次のように別のヘッダーファイルで宣言されています:

struct mcguffin {

  int num;
  char word[20];
};
4

1 に答える 1

2
new = (struct mcguffin *)malloc(sizeof(struct mcguffin *));
                                                      ^^

マクガフィンへのポインタに十分なスペースを割り当てています。をドロップし*ます。さらに良いことに、次のように変更します。

new = malloc(sizeof *new);

あなたのlist割り当ても同様に間違っています。次のものを割り当てる必要があります。

struct mcguffin **list = malloc(10 * sizeof *list);
于 2012-11-18T20:45:11.687 に答える