• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Alokacja pamięci,lista,segmentation fault

0 głosów
312 wizyt
pytanie zadane 1 grudnia 2019 w C i C++ przez Aleksandra01 Użytkownik (530 p.)
edycja 1 grudnia 2019 przez Aleksandra01
#include "intLinkedList.h"

IntLinkedList::IntLinkedList()
{
	head=NULL;
	tail=NULL;
}

IntLinkedList::~IntLinkedList()
{
	isEmpty();
}

int IntLinkedList::size()
{
	int size=0;
	struct Element* temp = head;
	if(temp==NULL)
		return size;
    while (temp != tail) {
		head = temp->next;
		size++;
	}

	return size;
}

int IntLinkedList::isEmpty()
{
	if(head==NULL)
		return 1;
	else
		return 0;
}

void IntLinkedList::print()
{	
	struct Element* temp = head;
	int size=0;
	while (temp != tail) {
		head = temp->next;
		size++;}
	std::cout << "[";
    for(int i=0;i<size;i++){
        std::cout << temp->value;
        if(i<(size-1))
            std::cout << ",";
    }
        std::cout << "]\n";
}

void IntLinkedList::append(int val)
{
	struct Element* new_el= new struct Element;
	
	if (new_el==NULL){
		printf("Blad!\n");
		return;
	}
	
	
	new_el->value=val;
	head->next=NULL;
	
	if(head==NULL){
		head=new_el;
		
	}else{
		struct Element *temp=head;
		
		while(new_el->next != NULL){	
		
			new_el=new_el->next;
		}		
			temp->next=NULL;
    }
}

plik nagłówkowy

#pragma once
#include <iostream>


struct Element{
    int value;
    struct Element *next;

};

class IntLinkedList{
    
private:
	struct Element* head;
	struct Element* tail;
public:
	IntLinkedList();
	~IntLinkedList();
	int size(); //funkcja zwracajaca rozmiar listy
	int isEmpty(); //funkcja sprawdzająca czy lista jest pusta czy nie
	void print(); // drukuje listę w postaci [w1, w2, w3]
	void append(int); //wstawia wartość na koniec listy
			
};

Mianowicie mam problem z rozwiązaniem problemu:
segmentation fault pojawia mi się przy wywołaniu funkcji append

valgrind pokazuje:

"Invalid write of size 8
==323==    at 0x108D0C: IntLinkedList::append(int)
.....
 HEAP SUMMARY:
==323==     in use at exit: 16 bytes in 1 blocks
==323==   total heap usage: 3 allocs, 2 frees, 76,816 bytes allocated

...."

 

komentarz 1 grudnia 2019 przez j23 Mędrzec (195,220 p.)

Ten struct przed nazwą struktury jest niepotrzebny w C++.

1 odpowiedź

0 głosów
odpowiedź 1 grudnia 2019 przez criss Mędrzec (172,570 p.)

W jakiś dziwny sposób mylisz temp i new_el. Logicznie jest prawie poprawnie jak w prawie calym kodzie podmienisz new_el na temp, ale są drobne błędy tez w innych miejscach. Głównie jednak chodzi o zawartosc else. Nie powiem ci co robisz źle, bo nie skumałem o co moglo ci chodzić. Jeśli nic nie pomieszalem (nie testowalem) to powinno to wyglądać tak (porównaj ze swoim):

void IntLinkedList::append(int val)
{
    struct Element* new_el= new struct Element;
     
    if (new_el==NULL){
        printf("Blad!\n");
        return;
    }
     
     
    new_el->value=val;
    new_el->next = NULL;
     
    if(head==NULL){
        head=new_el;
         
    }else{
        struct Element *temp=head;
         
        while(temp->next != NULL){ 
         
            temp=temp->next;
        }       
        temp->next=new_el;
    }
}

 

Podobne pytania

0 głosów
0 odpowiedzi 1,403 wizyt
+1 głos
1 odpowiedź 410 wizyt
pytanie zadane 17 lutego 2022 w C i C++ przez Yaqbek Nowicjusz (160 p.)
0 głosów
0 odpowiedzi 301 wizyt

93,741 zapytań

142,676 odpowiedzi

323,294 komentarzy

63,323 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...