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

błąd przepełnienia buforu

Cloud VPS
0 głosów
930 wizyt
pytanie zadane 15 marca 2020 w C i C++ przez Matibedi335 Początkujący (350 p.)

Witam, poniżej zamieszczam kod, oraz screen błędu. Chcialbym wiedzieć jak sobie z nim poradzić, bo nie do końca rozumiem co jest nie tak. W skrócie co robi program:

na wejściu dostaje liczbę n, ma przechowywać n-liczb dowolnej długości. 

gdy debuguje, problem pojawia się przy wpisaniu przez użytkownika 'q' i zwalnianiu tablicy (84 linia)

#include <iostream>
using namespace std;

int main() {



    int n;
    cin >> n;

    char** tablica = (char**)malloc(sizeof(char) * (n+1));
    int* suma_cyfr = (int*)malloc(sizeof(int) * (n+1));
    
    memset(suma_cyfr, 0, n * sizeof(int));
    
    if (tablica == NULL)
    {
        free(suma_cyfr);
        return 1;
    }

    if (suma_cyfr == NULL)
    {
        free(tablica);
        return 1;
    }




    for (int i = -1; i < n; i++)
    {

        char* pomocnicza = (char*)malloc(sizeof(char) * 300);

        if (pomocnicza == NULL)
        {
            free(tablica);
            free(suma_cyfr);
            return 1;
        }

        if (i == 0)
            pomocnicza[0] = 1;

        for (int k = 0; k<300; k++)
        {
            pomocnicza[k] = getchar();
            if (pomocnicza[k] == 10)
            {
                suma_cyfr[i] = k;      
                break;
            }
        }

        tablica[i] = (char*)malloc(2+2 * (suma_cyfr[i]+1));

        for (int j = 0; j < suma_cyfr[i]; j++)
            tablica[i][j] = pomocnicza[j];


        free(pomocnicza);
    }


    char a;

    while (true)
    {
       
        cin >> a;

        if (a == '?')
        {
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < suma_cyfr[i]; j++)
                    cout << tablica[i][j];
                cout << endl;
            }
        }
        else if (a == 'q')
        {
            free(tablica);
            free(suma_cyfr);

            return 1;
        }




    }

  

    free(tablica);
    free(suma_cyfr);

    return 0;
}

komentarz 15 marca 2020 przez Great Stary wyjadacz (12,660 p.)
Wklej błędy jako tekst.

2 odpowiedzi

+1 głos
odpowiedź 15 marca 2020 przez j23 Mędrzec (195,240 p.)
for (int i = -1; i < n; i++) {
    ...
    tablica[i] = ...
    ...
}

Indeksowanie ujemnym indeksem (na ogół) nie jest dobrym pomysłem.

0 głosów
odpowiedź 15 marca 2020 przez Matibedi335 Początkujący (350 p.)
Ostrzeżenie    C6386    Przepełnienie buforu podczas zapisu w elemencie „tablica[i]”: rozmiar obszaru do zapisu to „2+2*((suma_cyfr[i]+1))”, ale zapisana liczba bajtów może wynieść: „2”.  linia 59

Ostrzeżenie    C6385    Odczyt nieprawidłowych danych z elementu „tablica[i]”: rozmiar obszaru do odczytu to „2+2*((suma_cyfr[i]+1))”, ale odczytana liczba bajtów może wynieść: „2”.   linia    78    

Ostrzeżenie    C6385    Odczyt nieprawidłowych danych z elementu „tablica”: rozmiar obszaru do odczytu to „sizeof(char)*((n+1))”, ale odczytana liczba bajtów może wynieść: „8”.    linia    78
komentarz 15 marca 2020 przez j23 Mędrzec (195,240 p.)
To powinieneś dać w komentarzu, a nie jako odpowiedź.

Podobne pytania

0 głosów
1 odpowiedź 2,819 wizyt
pytanie zadane 30 listopada 2018 w C i C++ przez czujek22 Dyskutant (7,670 p.)
0 głosów
1 odpowiedź 166 wizyt
pytanie zadane 24 sierpnia 2016 w C i C++ przez toyboy1996 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 329 wizyt
pytanie zadane 23 października 2020 w C i C++ przez adamos321 Nowicjusz (140 p.)

93,459 zapytań

142,454 odpowiedzi

322,724 komentarzy

62,837 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

Kursy INF.02 i INF.03
...