Pointer to pointer tworzenie tablicy

0

otóż mój problem polega na błędzie SIGSEGV w funkcji

int create_array_int(int **ptr, int N)
{
    if(N < 1) return 1;
    *ptr = malloc(sizeof(int)* N);
    if(*ptr==NULL) return 2;
    return 0;
}

może źle się gdzieś odwołuję? Pierwszy raz się spotykam ze wskaźnikiem na wskaźnik z literatury udało mi się wyczytać że powinno to tak wyglądać. Jednak pokazuje SIGSEGV.

1

Ten fragment kodu jest prawidłowy. To kod wywołujący jest niepoprawny.
Możesz dodać:

if (!ptr) return 3;
0

Problem w tym że uczelniany kompilator sprawdza tylko ten fragment nic więcej.
Podstawia sobie wartości jakieś.

0

Fragment


*ptr = malloc(sizeof(int)* N);

jest prawidłowy tylko wtedy, gdy sizeof(int)==sizeof(int*). Na wielu architekturach tak, ale nie zawsze. Brak jednej gwiazdki, byłby prawidłowy bezwzględnie

Po drugie, malloc() NIE CZYŚCI pamięci, masz tam wartości przypadkowe. Sugeruję calloc()

0

Poradziłem sobie, test sprawdza co się dzieje gdy ptr jest NULL czy ma to sens? Bo moim zdaniem powinien być NULL skoro dopiero w tej funkcji będę przydzielał pamięć?

Mówimy tutaj o 2 różnych wskaźnikach.
*ptr to wskaźnik na tablicę, którą tworzysz. Przy wejściu do funkcji może mieć dowolną wartość, w tym NULL.

ptr to wskaźnik na miejsce, gdzie ten wskaźnik na tablicę leży. Funkcja, która woła Twoją funkcję przekazuje ten wskaźnik i mówi zapisz w tym miejscu adres tablicy, którą tworzysz. Jasne wtedy jest, że to miejsce nie może być NULLem.

0

Brzmi to sensownie, w każdym razie trochę się nauczyłem o wskaźnikach na wskaźniki :3 dziękuje wszystkim za pomoc i rady :)

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