質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.02%

ポインターQueueに新しく構造体を追加したい

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 558

k1225

score 9

 前提・実現したいこと

C++でqueue(dataフィールドと前後の構造体を指すpointerのフィールドが2つある)の後ろに新しい文字を含んだ構造体を追加したいのですが、以下のソースコードのerror exception!!のコメントがあるところに矢印が引っ張ってあり、以下のエラーメッセージが出て実行出来ません。ここでのエラーメッセージの意味と、具体的にコードの何を改善すれば良いのかアドバイスをお願いいたします。

 発生している問題・エラーメッセージ

First-chance exception at 0x009D6016 in template.exe: 0xC0000005: Access violation writing location 0x0000001C.

If there is a handler for this exception, the program may be safely continued.

 該当のソースコード

header file

#include <string>    //this allows you to declare and use strings
#include <iostream>
using namespace std;

struct qNode
{ 
    string data;
    qNode* next;
    qNode* previous;
} ;

class CBQueue
{  public:
       CBQueue();    
       int getSize() const;
       bool isEmpty() const;
       void enqueue(string s);
       void printF2B() const;
       void printB2F() const;
       string dequeue();
       void cut(string s);
       string bail();
       void B2F();
       bool equals(CBQueue otherQ) const;
   private:
       qNode* temp;
       qNode* front;
       qNode* rear;
       int size;
} ;


cpp file

CBQueue::CBQueue()
//preondition: none
//postcondition: set is empty
{
    front = NULL;
    rear = NULL;
    size = 0;
}

...

void CBQueue::enqueue(string s)
//preondition: none
//postcondition: add a new structure containing string s to the rear of the queue
{
    temp = new qNode;
    temp->data = s;
    temp->next = NULL;

    if (size == 0)
    {
        front = rear = temp;
        temp->previous = NULL;
    }
//ERROR EXCEPTION!!        
    else
    {
        rear->next = temp; // ERROR EXCEPTION!!
        temp->previous = rear;
    }

    rear = temp;
    size++;
}

 試したこと

ここに問題に対して試したことを記載してください。

 補足情報(FW/ツールのバージョンなど)

Microsoft (macOS10.12.6 仮想環境)
Microsoft Visual Studio 2013

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • wwbQzhMkhhgEmhU

    2018/10/15 06:13

    メッセージとしてはデバッガで実行してるように見えるのですが、コンパイル出来ないとデバッグは出来ません。よく分かりません。

    キャンセル

回答 2

+1

Access violation writing location 0x0000001C.

不当アクセスです。
本来アクセスしてはいけない箇所に書き込みを行おうとしています
で、これは実行時エラーですよね?どこの行でこのエラーが出るんでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/15 11:46

    回答ありがとうございます。
    cppファイルの
    rear->next = temp; // ERROR EXCEPTION!!
    この行にエラーが出ます。

    キャンセル

  • 2018/10/15 11:55 編集

    rear にはNULLしか入りませんね

    ああ、これだと分かりづらいですね。
    temp->rear には、NULLしか入りませんね

    キャンセル

+1

実際に動かしてませんので外しているかもしれませんが、tempがメンバ変数で定義されているのが問題なんじゃないかと思います。
コードを見る限りtempに確保したqNodeのアドレスは別の変数に退避済みなので、ローカル変数として使い捨てにしたほうがすっきりするんじゃないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる