Absolutnie nie mam pojęcia o co chodzi ( wyłuskanie wskaznika NULL, język C)

0

Witam,
mam mały problem z moim programem(linked list) mianowicie dostaję błąd Wyłuskanie wskaźnika NULL w trzech miejscach mojego kodu i za bardzo nie wiem dlaczego tak jest, dokładnie ten sam program w C++ z zamienionym malloc na new, nie mam ostrzeżeń. Proszę o jakieś sugestie. Dodam, że moja przygoda z C i strukturami dopiero się zaczyna.

#include <stdio.h>
#include <stdlib.h>

struct Node {
	int data;
	struct Node* next;
}*first = NULL;

void create(int A[], int n) {
	int i;
	struct Node* t , * last ;
	first = (struct Node*)malloc(sizeof(struct Node));
	first->data = A[0];       // wyłuskanie ostrzezenie
	first->next=NULL;
	last = first;
	for (i = 1; i < n; i++) {
		t = (struct Node*)malloc(sizeof(struct Node));
		t->data = A[i];     // wyłuskanie ostrzezenie
        t->next = NULL;
		last->next=NULL;     // wyłuskanie ostrzezenie
		last = t;
	}
}

int main()
{
	int A[] = { 3,4,5,6,10,15 };
	create(A, 5);
	//displayRecursive(first);
	//display(first);
	//printf("\n%d", countRecursive(first));
	return 0;
}

5

Nie podałeś ostrzeżenia, jakie dostajesz, ale najpewniej jest to C6011.
Oznacza ono, że w tych miejscach wskaźnik może być pusty (może, ale nie musi).

Różnica między malloc a new (w przypadku tego ostrzeżenia) jest taka, że malloc może zwrócić Ci NULL jeśli braknie mu miejsca.
natomiast new rzuci wyjątkiem std::bad_alloc.

0

Jak już macasz się z C++, to od inicjowania pól jest KONSTRUKTOR a nie kod zewnętrzny

0

Czyli tak jak mówiłem: że jest to C6011. Żadnych ostrzeżeń nie należy Cię bać, należy jednak brać je pod uwagę. W tym przypadku prosty if( first != NULL ) powinno wystarczyć by się zabezpieczyć (ostrzeżenie nie musi jednak wtedy zniknąć) — @Bartosz36 dziś, 01:32

Ostrzeżeń nie należy się bać, ale należy je (w miarę możliwości bezwzględnie) likwidować. Każde ostrzeżenie to potencjalny błąd w czasie działania programu (czasem też błąd merytoryczny, nie tylko błąd.wyjątek działania).

2
Bartosz36 napisał(a):

Różnica między malloc a new (w przypadku tego ostrzeżenia) jest taka, że malloc może zwrócić Ci NULL jeśli braknie mu miejsca.
natomiast new rzuci wyjątkiem std::bad_alloc.

O ile nie alokujemy gigabajtów, na współczesnym sprzęcie zupełnie nie przejmowałbym się ewentualnością że zabrakło pamięci na małego malloca. Bo jeśli zabrakło, to znaczy system jest tak zmulony że praktycznie nic już nie działa i procesowi nie pozostaje zbyt wiele do zrobienia jak popełnić sudoku na dereferencji NULLa.

3
Bartosz36 napisał(a):

Nie podałeś ostrzeżenia, jakie dostajesz, ale najpewniej jest to C6011.

Oznacza ono, że w tych miejscach wskaźnik może być pusty (może, ale nie musi).

Różnica między malloc a new (w przypadku tego ostrzeżenia) jest taka, że malloc może zwrócić Ci NULL jeśli braknie mu miejsca.
natomiast new rzuci wyjątkiem std::bad_alloc.

Warto dodać, że zachowanie new można zmodyfikować poprzez std::nothrow. (Ref: https://en.cppreference.com/w/cpp/memory/new/nothrow) Przekazanie parametru std::nothrow do new powoduje zwrócenie nullptr, zamiast rzucania wyjątkiem podczas błędu alokacji.

0

Mam kolejne pytanie co do mojej funkcji insert mianowicie działa dla każdego indexu != 0. Wiem, że mogę zrobić osobną funkcje i przekazać do niej(Node** p, int value) i to działa sprawdzałem ale chciałbym żeby to było zawarte w jednej funkcji. W tym przypadku mój problem wynika raczej z braku doświadczenia z zaawansowanymi wskaźnikami.(jeżeli ktoś w tym przypadku mógłby to łopatologicznie przedstawić byłbym wdzięczny). Z góry dzięki za pomoc (funkcja jest w C++).

#include <iostream>
#include "Node.h"

class Node
{
public:
	int data{};
	Node* next{};
};

void insert(Node* p, int index, int value)
{
	int i;
	Node* newNode = new Node;
	newNode->data = value;
	if (index == 0) 
	{
		newNode->next = p;
		p = newNode;
	}
	else 
	{
		for ( i = 0; i < index - 1 && p != nullptr; i++) {
			p = p->next;
		}
		if (p != nullptr) newNode->next = p->next;
		p->next = newNode;
	}
}
int main() {
	Node* head = initialize(3);
	insert(head, 0, 24);
	insert(head, 2, 78);
	/*insert(head, 3, 32);
	insert(head, 4, 23);
	insert(head, 5, 43); */
	display(head);
	return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1