Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    110

    [C]Dove va il puntatore!?!?:-O

    Ciao a tutti
    oggi mentre stavo facendo un programma di quelli pallosi che ci aveva lasciato il prof. di uni ho riscontrato un problema strano che ho estrapolato e inserito in questo semplice programmino: :master:

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

    main()
    {
    char *prova;
    prova=(char*)malloc(5*sizeof(char));
    scanf("%s",prova);
    printf("%c",prova[0]);
    printf("%c",prova[1]);
    printf("%c",prova[2]);
    printf("%c",prova[3]);
    printf("%c",prova[4]);
    printf("%c",prova[5]);
    }

    Nello scanf ho scritto una parola + lunga di 5 caratteri e non mi dava nessun errore,poi ho inserito l'ultimo printf per vedere se li stampava anche gli elementi che "trabbordavano" dall'array e con sgomento ho visto che li stampava!!! VVoVe: sono arrivato alla conclusione che C non fa nessun controllo sulla lunghezza della stringa se corrisponde alla relativa variabile, è una conclusione sensata? il fatto che non mi dia una Segmentation fault è dato dal fatto che i carattereri che escono dall'array vanno a finire in zone di memoria ancora destinate al programma?.....il punto essenziale....come faccio a controllare che l'utente non metti + caratteri di quanto ne può contenere la variabile "prova" ?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466

    Re: [C]Dove va il puntatore!?!?:-O

    Originariamente inviato da 86frame
    Ciao a tutti
    oggi mentre stavo facendo un programma di quelli pallosi che ci aveva lasciato il prof. di uni ho riscontrato un problema strano che ho estrapolato e inserito in questo semplice programmino: :master:

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

    main()
    {
    char *prova;
    prova=(char*)malloc(5*sizeof(char));
    scanf("%s",prova);
    printf("%c",prova[0]);
    printf("%c",prova[1]);
    printf("%c",prova[2]);
    printf("%c",prova[3]);
    printf("%c",prova[4]);
    printf("%c",prova[5]);
    }

    Nello scanf ho scritto una parola + lunga di 5 caratteri e non mi dava nessun errore,poi ho inserito l'ultimo printf per vedere se li stampava anche gli elementi che "trabbordavano" dall'array e con sgomento ho visto che li stampava!!! VVoVe: sono arrivato alla conclusione che C non fa nessun controllo sulla lunghezza della stringa se corrisponde alla relativa variabile
    Ottima conclusione ... del resto, da nessuna parte c'e' scritto che la scanf effettua tale controllo ... ed e' per questo che la scanf e' una funzione *altamente sconsigliata* al fine di evitare attacchi di tipo "buffer overflow".

    E non e' solo quella ... sono tante ...

    Originariamente inviato da 86frame
    il fatto che non mi dia una Segmentation fault è dato dal fatto che i carattereri che escono dall'array vanno a finire in zone di memoria ancora destinate al programma?.....
    E' cosi' ...

    Originariamente inviato da 86frame
    il punto essenziale....come faccio a controllare che l'utente non metti + caratteri di quanto ne può contenere la variabile "prova" ?
    Non usi la scanf.

    1) Utilizzi una corrispondente funzione "safe" (che effettua tale controllo) che dipende dalle librerie del compilatore che usi ...

    2) Ne scrivi una tua che effettui i controlli carattere per carattere.

  3. #3
    Tra parentesi è abbastanza chiaro il perché non ti abbia dato un segmentation fault: la memoria che hai utilizzato era poca, e per di più stavi scrivendo nello heap, piuttosto capiente.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    io sono alle superiori, ma mi hanno consigliato di usare fgets() per leggere le stringhe.....sarebbe una funzione per i file, ma come stream gli dai stdin e sei apposto

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    110
    GRAZIE a tutti per le rsp...proverò e vi farò sapere.....

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.