stack smashing detected - o co chodzi?

0

Cześć, jestem całkiem nowy w programowaniu. Mam zadanie, Program dziala, jednak podczas kompilacji na końcu wychodzi(po wyniku) *** stack smashing detected ***: <unknown> terminated
Czy ktoś wie dlaczego?

Input
n - liczba testów n<100000, w kolejnych liniach n liczb z przedziału [1..10000]
Output
Dla każdej liczby słowo TAK, jeśli liczba ta jest pierwsza, słowo: NIE, w przeciwnym wypadku.
Przykład:
Input:
3
11
1
4
Output:
TAK
NIE
NIE

Moj kod:

#include <stdio.h>

int main()
{

    int liczbaTestow, liczbaInput, i, j;
    int arr[] = { 0 };
    i = 0;

    printf("Podaj liczbe testow, max do 10000! = ");
    scanf("%d", &liczbaTestow);
    if (liczbaTestow < 10000) {
        for (i = 0; i < liczbaTestow; i++) {
            printf("Podaj liczbe: ");
            scanf("%d", &liczbaInput);
            if (liczbaInput % 2 == 0 || liczbaInput % 3 == 0 || liczbaInput % 5 == 0 || liczbaInput % 7 == 0)
                arr[i] = 0;
            else
                arr[i] = 1;
        }

        for (j = 0; j < liczbaTestow; j++) {
            if (arr[j] == 1)
                printf("TAK\n");
            else if (arr[j] == 0)
                printf("NIE\n");
        }
    }
    else
        printf("ponad 10000");
    return 0;
}

Dzięki

2

Piszesz, że program działa, a gdzie tu sprawdzanie czy liczba jest pierwsza? Serio pytam.

4
int arr[] = { 0 };

Wielkość tej tablicy to zawsze jeden. Jeśli chcesz mieć własną wielkość to albo zadeklaruj Variable Length Array (VLA):

    i = 0;

    printf("Podaj liczbe testow, max do 10000! = ");
    scanf("%d", &liczbaTestow);
    int arr[liczbaTestow] = { 0 }; // koniecznie po wczytaniu liczbaTestow

Albo zadeklaruj ją z góry na maksymalną wartość. Przy większych tablicach warto użyć funkcji malloc() do alokacji, ale jeśli dopiero zaczynasz to możesz sobie to zostawić na później.

Niestety mam też dla Ciebie smutną wiadomość: po poprawieniu tego błędu kod zwraca niepoprawne wyniki:

Podaj liczbe testow, max do 10000! = 3
Podaj liczbe: 11
Podaj liczbe: 1
Podaj liczbe: 4
TAK
TAK
NIE

Niepoprawność jest na dwóch poziomach:

  1. Błędne wyniki
  2. Niepoprawny format - zauważ, że zadanie nie wspomina nic o tym, że masz wypisywać cokolwiek innego. Dlatego automatyczny tester może odrzucić takie rozwiązanie.

A, i jeszcze jedno: w całym tym zadaniu w ogóle nie potrzeba używać tablicy - wystarczy od razu wypisywać odpowiedź zamiast zbierać wejścia do tablicy a potem obliczać wszystkie.

2

Żeby odnieść się do treści pytania - stack smashing detected znaczy, że twój program zapisuje w miejsca gdzie mu nie wolno, przede wszystkim jak masz tablicę na stosie, i zapisujesz coś pod indeks większy niż maksymalny. Aby zapobiec takim zapisom (które mogą doprowadzić do "przejęcia kontroli nad programem"), stosuje się tak zwane kanarki stosu, taką specjalną wartość. Jak wartość się nie będzie zgadzać przy wyjściu z funkcji, to wyświetla się taki komunikat a program kończy działanie.

1

Może nie na temat, ale zdajesz sobie sprawdę że if (liczbaInput % 2 == 0 || liczbaInput % 3 == 0 || liczbaInput % 5 == 0 || liczbaInput % 7 == 0) przestaje być prawdziwe dla liczb większych i równych 11?

1 użytkowników online, w tym zalogowanych: 0, gości: 1