Dynamiczna alokacja pamięci - rozmiar tablicy podawany z klawiatury - C

0

Cześć,
Mam problem, chce zrobić program sprawdzający czy podane na wejściu liczby sa pierwsze. Ilość sprawdzanych liczb jest podawana przez użytkownika. Tu pojawia się problem. Chyba źle alokuję pomięć, bo jak sprawdzam rozmiar zaalokowanej tablicy pokazuje mi on rozmiar jednego inta. Czy mógłby to ktoś sprawdzić w wolnej chwili? Z góry dzięki.

#include <stdio.h>
 #include <cstdlib>

 int main(void)
 {
    int *tabN;
    int n = 0;

    printf("SPAWDZANIE LICZB PIERWSZYCH.\n");
    printf("Podaj liczbe testów: \n");

    scanf("%d", &n);

    tabN = (int*)malloc(n*sizeof(int));

    printf("rozmiar tablicy: %d: ", sizeof(*tabN));

    printf("Testów do wykonania: %d\n" , n);


    printf("WprowadŸ %d liczb do testu: \n", n);
    for(int i = 0; i<n; i++){
        scanf("%d", *(tabN+i));
        printf("\n");

   }
   //for(int j = 0; j<n; j++){
   //     printf("%i", *(tabN++));
   //}
```c
 
   

   return 0;
 }
1

Nie ma możliwości określenia rozmiaru dynamicznie przydzielonej tablicy.
Musisz tą informacje przechować "na własną rękę".

1

Przez malloca nie przejdzie. Jeśli jednak nie gardzisz stosem, w C99 i C11 możesz zwyczajnie stworzyć tablicę na stosie i w rozmiarze wpisać zmienną. Wtedy sizeof zadziała tak jakbyś chciał. Przykład:

 
#include <stdio.h>

int main(){
    int ile;
    scanf( "%d", &ile );

    int tablica[ile];
    int *wskaznik = tablica;

    printf( "%d, %d\n", sizeof( tablica ), sizeof( wskaznik ) );
    return 0;
}

dla ile=5 wypisze 20, 8 (gcc/linux, x86_64).

Tylko po co tak robić skoro i tak przechowujesz rozmiar tablicy w zmiennej? No i generalnie po co ci tablica skoro mógłbyś mieć tylko jednego inta i w każdym obiegu pętli wczytywać oddzielnie.

BTW, czy aby w scanfie nie powinno być tabn+i (bez dereferencji)?

0

Dzięki za opcje. Gdyby program sprawdzał tylko jedną zadaną liczbę, to bez problemu, ale jak podajesz ich na wejściu więcej, to gdzieś musisz je trzymać. I wymyśliłem do tego tablicę. Potem algorytm sprawdzający odnosiłby się do kolejnych elementów dynamicznie utworzonej tablicy. Jestem bardzo początkujący i to rozwiązanie wydawał mi się najbardziej... intuicyjne? :P

Racja co do scanfa... jeszcze dużo pracy przede mną.

0

Ale dane wejściowe poczekają na ciebie, a czasem ty na nie. Jak wywołujesz scanfa to możesz obliczyć wynik dla niego, a potem dopiero wczytać następne. Nawet gdybyś chciał potem do nich wrócić, bo tak naprawdę całe dane wejściowe są zapisywane poza twoim programem, najczęściej w jądrze, dzięki czemu o przechowywanie danych wejściowych, bo możesz w każdym momencie odtworzyć całą zawartość, język się nie zajmuje tym problemem. Przynajmniej dopóki nie mówimy o długich potokach lub socketach. :) W każdym razie to, że dane dotrwają co czasu kiedy je przeczytasz jest zagwarantowane...

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