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

question-closed Funkcja realloc, błąd SIGSEGV

0 głosów
315 wizyt
pytanie zadane 2 kwietnia 2023 w C i C++ przez Zuzan Początkujący (390 p.)
zamknięte 3 kwietnia 2023 przez Zuzan

Witam. Mam do napisania taką funkcję: 

int concatenate_arrays_int(int **a1, int size1, const int *a2, int size2);

Funkcja dokleja tablicę a2 o długości size2 na koniec tablicy a1 o długości size1 elementów. Funkcja powinna rozszerzyć obszar pamięci zajmowany przez tablicę a1 tak, aby pomieściła size1+size2 elementów. W przypadku niepowodzenia alokacji pamięci zawartość tablic nie powinna zostać zmieniona.

Wartość zwracana

  • 0 - w przypadku sukcesu,
  • 1 - w przypadku przekazania do funkcji błędnych danych wejściowych lub
  • 2 - w przypadku niepowodzenia alokacji pamięci.

Problem pojawia się w tym fragmencie funkcji: 

*(*(a1 + i)) = *(a2 + count);

A dokładniej pojawia się błąd SIGSEGV. Nie wiem jaka jest tego przyczyna i co mogłabym zmienić. Byłabym wdzięczna za wskazówki co robię źle i co mogę poprawić.

komentarz zamknięcia: otrzymalam odp

2 odpowiedzi

+1 głos
odpowiedź 2 kwietnia 2023 przez Gynvael Coldwind Nałogowiec (30,510 p.)

O jeden nawias za dużo:

*(*(a1 + i)) = *(a2 + count);

↓↓↓

*(*a1 + i) = *(a2 + count);

Btw, widzę, że sprawdzasz czy wielkości są mniejsze od zera. Pewnym ulepszenie mogłoby być użycie typu size_t zamiast int do wyrażania wielkości (to typ bez znaku, więc nie trzeba sprawdzać wielkości).

Btw2, size1 == 0 i size2 == 0 nie brzmi jak błąd. Brzmi po prostu jak puste tablice.

+1 głos
odpowiedź 2 kwietnia 2023 przez tangarr Mędrzec (155,140 p.)

Zanim wyjaśnię przyczynę wykrzaczenia programu chciałbym spytać co autor miał na myśli tworząc warunek

if ((a1 + i) != NULL && (a2 + count) != NULL) {

Przesuwasz nie ten wskaźnik co trzeba.
Dla uproszczenia dodaj nowy wskaźnik dla zwiększenia czytelności

int *ptr = *a1;
*(ptr+i) = *(a2 + count);

Ok, program działa, to teraz zastąpmy wystąpiania ptr wyrażeniem *a1

*((*a1)+i) = *(a2 + count);

Aha i wywal ten dziwny warunek
 

Podobne pytania

+1 głos
3 odpowiedzi 2,296 wizyt
pytanie zadane 17 czerwca 2016 w C i C++ przez niezalogowany
0 głosów
0 odpowiedzi 357 wizyt
pytanie zadane 26 lutego 2022 w C i C++ przez Rafek Nowicjusz (120 p.)
0 głosów
1 odpowiedź 1,155 wizyt
pytanie zadane 9 marca 2018 w C i C++ przez Lucash Nowicjusz (240 p.)

93,731 zapytań

142,668 odpowiedzi

323,286 komentarzy

63,290 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.

...