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

Podejrzenie błędu alokacji pamięci - język C - kod błędu 139 (segmentation fault).

Object Storage Arubacloud
0 głosów
847 wizyt
pytanie zadane 16 maja 2020 w C i C++ przez Srubinsky Nowicjusz (140 p.)

Dobry wieczór,

mam pewien problem ze stworzeniem prostego programu, który oblicza sumę i średnią z wartości umieszczonych w tablicy. Kompilując program nie mam błędu, natomiast narzędzia do testów pokazują taki błąd: Program przerwany; kod błędu=139 (Sygnał SIGSEGV).

To jest mój kod (działa dla małej ilości danych):

#include <stdio.h>
#include <stdlib.h>

//int sum(const float* tab, unsigned int size, float *result);
//int avg(const float* tab, unsigned int size, float *result);
//int read_vector_float(float *vec, int size, float stop_value);

int i = 0;

int read_vector_float(float *vec, int size, float stop_value){
    printf("Podaj liczby: ");
    if(size < 0 || size > 100){
        return -1;
    }
    for(i=0; i < size; i++){
        if(scanf("%f", &*vec) != 1){
            printf("Incorrect input");
            return -2;
        }
        if(*vec == stop_value) {
            break;
        }
        ++vec;
    }
    return i;
}

int sum(const float* tab, unsigned int size, float *result){
    if(size > 100){
        return 1;
    }
    for(int j=0; j < i; j++){
        *result = *result + *tab;
        ++tab;
    }
    return 0;
}

int avg(const float* tab, unsigned int size, float *result){

    double sum = 0;
    for(int j=0; j < (int)size; j++){
        sum += *tab;
        ++tab;
    }
    *result = (float)sum / (float)size;
    return 0;
}

int main() {


    float T[100] = {0};
    float *tPointer;
    tPointer = (float*)&T;
    float result = 0;
    float *pResult;
    pResult = (float*)&result;
    read_vector_float(tPointer, 100, 0);
    sum(tPointer, i, pResult);
    printf("Suma: %.2f\n", result);
    result = 0;
    avg(tPointer, i, pResult);
    printf("Srednia: %.2f\n", result);
    return 0;
}

Narzędzie do testowania funkcji avg wprowadza ogromną tablicę (niezwiązaną z moją tablicą T[100]), w polu size jest np. 1200 elementów. Mój kod nie posiada praktycznie żadnych zabezpieczeń wskazanych w poleceniu, ale to jeszcze przede mną. Chciałbym nauczyć się rozwiązywać problemy z dynamiczną alokacją pamięci, a tu jest moim zdaniem problem. Prawdopodobnie brakuje mi którejś z tych funkcji: malloc, calloc lub free. Czy mogę prosić o wskazówki? Męczę się z tematem już 5-6 godzin.

Jako dodatek załączam fragment z oprogramowania do testowania:

Źródło błędu SIGSEGV wykryto w funkcji avg, plik main.c:45
Widok kodu źródłowego:



int avg(const float* tab, unsigned int size, float *result){

    double sum = 0;
    for(int j=0; j < (int)size; j++){
        sum += *tab;       //tutaj jest błąd
        ++tab;
    }
    *result = (float)sum / (float)size;
    return 0;

Z góry dziękuję za podpowiedzi.

komentarz 16 maja 2020 przez Asertywny Mądrala (5,430 p.)
Podaj plik z danymi, dla których program się wywala.

Po co Ci zarówno size jak i stop value? Czy jeśli stop value pojawia się wcześniej niż po wczytaniu size elementów, masz nie czytać dalej?
komentarz 16 maja 2020 przez TOWaD Mądrala (5,700 p.)
edycja 17 maja 2020 przez TOWaD
*result = (float)sum / (size+1.0);

No i wkaznik przesuwasz a nigdzie go nie zerujesz tak na moje oko. Ale mogę się mylić

Rzeczywiście myliłem się wysyłasz kopię.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 147 wizyt
pytanie zadane 1 grudnia 2019 w C i C++ przez Aleksandra01 Użytkownik (530 p.)
+1 głos
1 odpowiedź 207 wizyt
pytanie zadane 17 lutego 2022 w C i C++ przez Yaqbek Nowicjusz (160 p.)
0 głosów
0 odpowiedzi 121 wizyt

92,551 zapytań

141,399 odpowiedzi

319,531 komentarzy

61,937 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!

...