• 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).

0 głosów
1,403 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 (6,800 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ź 311 wizyt
pytanie zadane 1 grudnia 2019 w C i C++ przez Aleksandra01 Użytkownik (530 p.)
+1 głos
1 odpowiedź 410 wizyt
pytanie zadane 17 lutego 2022 w C i C++ przez Yaqbek Nowicjusz (160 p.)
0 głosów
0 odpowiedzi 300 wizyt

93,741 zapytań

142,676 odpowiedzi

323,294 komentarzy

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

...