• 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

Hosting forpsi easy 1 pln
0 głosów
155 wizyt
pytanie zadane 2 kwietnia w C i C++ przez Zuzan Początkujący (390 p.)
zamknięte 3 kwietnia 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 przez Gynvael Coldwind Nałogowiec (25,710 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 przez tangarr Mędrzec (154,200 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 1,918 wizyt
pytanie zadane 17 czerwca 2016 w C i C++ przez niezalogowany
0 głosów
0 odpowiedzi 145 wizyt
pytanie zadane 26 lutego 2022 w C i C++ przez Rafek Nowicjusz (120 p.)
0 głosów
1 odpowiedź 876 wizyt
pytanie zadane 9 marca 2018 w C i C++ przez Lucash Nowicjusz (240 p.)

92,081 zapytań

140,737 odpowiedzi

317,697 komentarzy

61,401 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia w koszyku, uzyskując rabat aż -50% (w dniach 24.11 - 29.11 z okazji Black Friday, a potem będzie to -30%) na bilety w wersji "Standard"! Więcej informacji na temat akademii znajdziecie tutaj. Dziękujemy Sekurakowi za tak fajną zniżkę dla Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 15% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...