اذهب إلى المحتوى
  • 0

segmentation fault في c++

RAA

السؤال

Recommended Posts

  • 0

إنك لا تقوم باختبار فيما إذا كان ال head يشير إلى ال NULL، يحدث أول خطأ في هذا المقطع:

void swapFirstLast()
 {
  node *temp = head;
  int value = head->data;  // هنا الخطأ
  while(temp!=NULL)
  {
    if(temp->next == NULL)
    {
      head->data = temp->data ;
      temp->data = value;
    }
    temp = temp->next;
  }
};

يجب عليك دائما التحقق فيما إذا كان مؤشر ما يشير إلى ال NULL قبل الوصول إلى بياناته.

بالإضافة إلى ذلك يجب عليك استعمال nullptr فقط بدل من NULL لأن هذا الموصى به، أو على الأقل لا تخلط بينهما في الاستعمال.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 23 دقائق مضت قال Kais Hasan:

إنك لا تقوم باختبار فيما إذا كان ال head يشير إلى ال NULL، يحدث أول خطأ في هذا المقطع:


void swapFirstLast()
 {
  node *temp = head;
  int value = head->data;  // هنا الخطأ
  while(temp!=NULL)
  {
    if(temp->next == NULL)
    {
      head->data = temp->data ;
      temp->data = value;
    }
    temp = temp->next;
  }
};

يجب عليك دائما التحقق فيما إذا كان مؤشر ما يشير إلى ال NULL قبل الوصول إلى بياناته.

بالإضافة إلى ذلك يجب عليك استعمال nullptr فقط بدل من NULL لأن هذا الموصى به، أو على الأقل لا تخلط بينهما في الاستعمال.

متل هيك

 void swapFirstLast() 
 {

        node* helpPtr = head;
        if(head==nullptr)
        {
            
        int value=head->data;
        cout << "Error : cannot swap(the list has less than two nodes)";
        }
       
        int temp = helpPtr->data;
        
        while (helpPtr != nullptr)
        {
            if (helpPtr->next == nullptr)
            {
                int value = helpPtr->data;
                helpPtr->data;



            }
            helpPtr = helpPtr->next;
        }

        node* helpPtr2 = head;
        helpPtr2->data;

    };

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 19 دقائق مضت قال RAA:

متل هيك


 void swapFirstLast() 
 {

        node* helpPtr = head;
        if(head==nullptr)
        {
            
        int value=head->data;
        cout << "Error : cannot swap(the list has less than two nodes)";
        }
       
        int temp = helpPtr->data;
        
        while (helpPtr != nullptr)
        {
            if (helpPtr->next == nullptr)
            {
                int value = helpPtr->data;
                helpPtr->data;



            }
            helpPtr = helpPtr->next;
        }

        node* helpPtr2 = head;
        helpPtr2->data;

    };

 

نفس الخطأ يتكرر، عندما تقوم باستعمال معامل السهم فأنت تصل إلى البيانات الخاصة بما يؤشر عليه المؤشر، و لكن في حال كان nullptr فإنه لا يؤشر على شيء و بالتالي سيحدث خطأ.

انت وضعت شرط تختبره إذا nullptr و قمت بالوصول إلى قيمته في ذلك الشرط مما يؤكد حدوث خطأ هناك.

الحل هو كما يلي:

void swapFirstLast()
 {
  
  if (head == nullptr) return;
  
  node *temp = head;
  
  int value = head->data;
  while(temp!= nullptr)
  {
    if(temp->next == nullptr)
    {
      head->data = temp->data ;
      temp->data = value;
    }
    temp = temp->next;
  }
};

طبعاً لاحظ أنني استبدلت NULL ب nullptr، تذكر القيام بذلك من أجل كل الكود.

يمكنك محاكاة ما سبق في كافة التوابع التي تقوم فيها بالوصول إلى مؤشر، تذكر القاعدة دائماً أنه قبل الوصول إلى المؤشر يجب التأكد من أنه يؤشر إلى غرض ما بالفعل و ليس إلى nullptr.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...