• 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
161 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,260 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,921 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ź 882 wizyt
pytanie zadane 9 marca 2018 w C i C++ przez Lucash Nowicjusz (240 p.)

92,130 zapytań

140,788 odpowiedzi

317,814 komentarzy

61,452 pasjonatów

Advent of Code 2023

Top 15 użytkowników

  1. 1886p. - Łukasz Eckert
  2. 1856p. - Dawid128
  3. 1844p. - Marcin Putra
  4. 1844p. - CC PL
  5. 1775p. - Mikbac
  6. 1644p. - jaroslawroszyk
  7. 1633p. - rafalszastok
  8. 1562p. - rucin93
  9. 1553p. - sefirek
  10. 1492p. - Adrian Wieprzkowicz
  11. 1456p. - Eryk Andrzejewski
  12. 1424p. - ssynowiec
  13. 1383p. - Rafał Trójniak
  14. 1325p. - Michal Drewniak
  15. 1275p. - dia-Chann
Szczegóły i pełne wyniki

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.

Uwaga - w dniach od 02.12 do 08.12 trwają Mikołajki (książki drukowane mają rabat -35%, ebooki do -45%). Zaś dodatkowy, specjalny kod zniżkowy: HELMIKOLAJ-10 dla naszych Widzów zapewni Wam oszczędność -10zł dla zamówień powyżej 70zł! Warto korzystać!

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 - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...