ホーム>source

上記のコードでは、プロセスがステータス-1073741819で終了し、34行目の4が印刷されていませんデバッグするとセグメンテーションエラーが発生する

#include <iostream>
using namespace std;
struct node
{
    int data;
    node * link;
};
node * createList(int a)
{
    node * temp =new node();
    temp->data=a;
    temp->link=NULL;
    node * A=new node();
    A=temp;
    return A;
}
void printList(node * a)
{
    node * temp=NULL;
    temp=a;
    do
    {
        cout<<temp->data;
        temp=temp->link;
    }
    while(temp->link!=NULL);
}
int main()
{
    node * A=createList(3);
    printList(A);
    cout<<4;//line 34
    return 0;
}

あなたの答え
  • 解決した方法 # 1

    do-whileループでは、条件はこれまでの1つの要素です。

    do
    {
        cout<<temp->data;
        temp=temp->link;            // (1) temp is now pointing to the next element
     }
     while(temp->link!=NULL);       // (2) check if temp has a next element
    
    

    (1)で次の要素があると仮定し(ポインタを間接参照しない限り問題ありません)、条件(2)でこの次の要素に次の要素があるかどうかを確認します。代わりに、(1)で設定されたポインターが有効かどうかを確認する必要があります。すなわち:

    do { 
        temp = temp->link;
    while(temp != NULL);
    
    

    または、whileループを使用して、メソッドに渡されたnullポインターも正しく処理します(一時的なものは必要ありません)。

    void printList(node * a) {
        while (a) {
            cout<<a->data;
            a = a->link;
        }
    }
    
    

  • 解決した方法 # 2

       #include <iostream>
        using namespace std;
        struct node
        {
            int data;
            node * link;
        };
        node * createList(int a)
        {
            node * temp =new node();
            temp->data=a;
            temp->link=NULL;
            node * A=new node();
            A=temp; // you lose the pointer hold in A this is a memory leak
            return A;
        }
        void printList(node * a)
        {
            node * temp=NULL;
            temp=a;
            do
            {
                cout<<temp->data;
                temp=temp->link; // on the last loop temp will be null
            }
            while(temp->link!=NULL); // you access temp->link so on the last loop when temp is null you are dereferencing null, it undefined behavior
        }
        int main()
        {
            node * A=createList(3);
            printList(A);
            cout<<4;
            //don't forget to delete what you new
            return 0;
        }
    
    

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ java - javaFXでarrayListを使用して多数のボタンを実装する