• 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

Object Storage Arubacloud
0 głosów
177 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 (27,530 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 (154,860 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,949 wizyt
pytanie zadane 17 czerwca 2016 w C i C++ przez niezalogowany
0 głosów
0 odpowiedzi 171 wizyt
pytanie zadane 26 lutego 2022 w C i C++ przez Rafek Nowicjusz (120 p.)
0 głosów
1 odpowiedź 958 wizyt
pytanie zadane 9 marca 2018 w C i C++ przez Lucash Nowicjusz (240 p.)

92,578 zapytań

141,426 odpowiedzi

319,653 komentarzy

61,961 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich 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 10% 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!

...