構造体メンバーにアクセスするセグメンテーション違反

マシュー

私はCを学んでいて、リンクリストの使用に問題があります。リンクリストへのポインタをループすると、セグメンテーション違反が発生し、その理由がわかりません。

同様の質問を見ると、メモリを割り当てることが提案されていますが、この答えは紛らわしいと思います。リンクリストにヒープメモリを使用する必要がありますか?使用する場合、その理由は何ですか?

これが私のコードです:

#include <stdio.h>

typedef struct Node {
  char *name;
  struct Node *next;
} Node;

typedef struct Thing {
  Node *node;
} Thing;

Thing make_thing()
{
  Thing t = {
    .node = NULL
  };
  return t;
}

Thing * add_node(Thing *t, char *name)
{
  Node node = {
    .name = name,
    .next = t->node
  };

  t->node = &node;

  return t;
}

void print_nodes(Thing *t)
{
  Node *n = t->node;

  while(n != NULL) {
    printf("Node: %s\n", n->name);
    n = n->next;
  }
}

int main()
{
  printf("Start\n");

  Thing t = make_thing();
  add_node(&t, "one");

  printf("First %s\n", t.node->name);

  print_nodes(&t);

  return 0;
}
Ctx

スコープ外の自動ストレージを持つオブジェクトを使用しています。

Node node = {
  .name = name,
  .next = t->node
};

t->node = &node;

return t;

ここ&nodeでは、戻った後に無効な(スコープ外の)ポインターを呼び出し元にリークし、ここで使用します。

 printf("First %s\n", t.node->name);

構造体にを使用malloc()してメモリを割り当てる必要がありますNode

例:

 Node *node = malloc(sizeof *node);
 node->name = name;
 node->next = t->node;
 t->node = node;

 return t;

メモリリークを防ぐために使用されなくなったメモリを解放することに注意する必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

構造体にアクセスする際のセグメンテーション違反

unique_ptrを介して構造体メンバーにアクセスすると、セグメンテーション違反が発生します

構造体へのアクセスによるセグメンテーション違反

構造体の構造体のポインタにアクセスするときのセグメンテーション違反

構造にアクセスする際のセグメンテーション違反

C-割り当て後に構造体属性にアクセスすると、セグメンテーション違反が発生します

構造体の文字列にアクセスしようとすると、セグメンテーション違反が発生します

構造体の配列にアクセスすると、セグメンテーション違反が発生します

構造体メンバーに値を追加するときの構造体セグメンテーション違反

typedef構造体のセグメンテーション違反

C ++セグメンテーション違反構造体

null構造体のセグメンテーション違反?

構造体のコピーに関するセグメンテーション違反

C ++構造体からメンバー参照にアクセスするときにmallocがセグメンテーション違反を生成するのはなぜですか?

セグメンテーション違反を引き起こす構造体

構造体のメンバーにアクセスしようとすると、なぜセグメンテーション違反が発生するのですか?

strcpyを使用して「文字列」を構造体メンバーchar *にコピーする際のセグメンテーション違反

構造体のポインタにアクセスしようとしたときのセグメンテーション違反

構造体ポインタを関数に渡すセグメンテーション違反

C で構造体とポインタを使用する際のセグメンテーション違反

ノード構造体の使用におけるセグメンテーション違反

Cの構造体でqsortを使用するとセグメンテーション違反が発生する

セグメンテーション違反と構造体の関係

Cの構造体を使用したセグメンテーション違反

C構造体の初期化とセグメンテーション違反

セグメンテーション違反と構造体配列の参照

構造体セグメンテーション違反のC配列

構造体の多次元配列-セグメンテーション違反

C構造体配列のセグメンテーション違反

TOP 一覧

  1. 1

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  2. 2

    CSSのみを使用して三角形のアニメーションを作成する方法

  3. 3

    ZScalerと証明書の問題により、Dockerを使用できません

  4. 4

    ドロップダウンリストで選択したアイテムのQComboBoxスタイル

  5. 5

    別のホストからTomcat Managerアプリにアクセスする

  6. 6

    PyCharmリモートインタープリターはプロジェクトタブにサイトパッケージのコンテンツを表示しません

  7. 7

    Windows 10でのUSB入力デバイスの挿入/取り外しの検出

  8. 8

    Python / SciPyのピーク検出アルゴリズム

  9. 9

    MLでのデータ前処理の背後にある直感

  10. 10

    useRefに反応してコンポーネントをスクロールして表示する

  11. 11

    モーダルダイアログを自動的に閉じる-サーバーコードが完了したら、Googleスプレッドシートのダイアログを閉じます

  12. 12

    パンダは異なる名前の列に追加します

  13. 13

    PictureBoxで画像のブレンドを無効にする

  14. 14

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  15. 15

    Pythonを使用して、リストからデータを読み取り、特定の値をElasticsearchにインデックス付けするにはどうすればよいですか?

  16. 16

    LinuxでPySide2(Qt for Python)をインストールするQt Designerはどこにありますか?

  17. 17

    Material-UIでTextFieldエラーの色を条件付きでオーバーライドする方法

  18. 18

    goormIDEは、ターミナルがロードするデフォルトプロジェクトを変更します

  19. 19

    MatplotlibまたはSeabornを使用して、グループ化されたデータから複数のプロットを生成するにはどうすればよいですか?

  20. 20

    Luaの文字列から特定の特殊文字を削除するにはどうすればよいですか?

  21. 21

    Flutterにファイルピッカープラグインを追加するにはどうすればよいですか?

ホットタグ

アーカイブ