Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    problema di Buffer OverFlow con Linux e la getchar()

    Ho un piccolo problema con le stringhe in c :

    il seguente codice dovrebbe attendere da tastiera l'immissione
    di una Stringa di lunghezza 40 o terminare appena si preme invio:
    ..
    char c[];
    ..

    for(i=0;*(c+i)=getchar()!='\n';i++);
    *(c+i)='\0';
    ..

    cosa succede,che se immetto una stringa,la getchar attende invio;
    quindi finche' non premo invio la getchar continua a scrivere sul
    buffer;
    attenzione che *(c+i) lo ho gia proato a sostituire con
    c[i];
    e che anche se scrivo c[40]='\0';
    o *(c+40)='\0';
    quando scrivo la stringa mi va in overflow;
    che sia un problema di gcc???

  2. #2
    il codice era ..
    for(i=0;*(c+i)=getchar()!='\n'&&(i<40);i++);
    *(c+i)='\0';
    ..
    errore di battitura..
    comunque non risolve..

  3. #3
    Scusa ma si possono definire dei vettori senza specificarne la lunghezza ??

    [PASTE CODE]
    ..
    char c[];
    ..

    for(i=0;*(c+i)=getchar()!='\n';i++);
    *(c+i)='\0';
    ..

    [/PASTE CODE]

    non dovresti scrivere
    char c[40];

    Potrei sbagliarmi, anche perchè ho la febbre ç_ç

  4. #4
    Ha detto bene gdpietro, in C la stringa è un vettore di caratteri, e l'ANSI C dice che il numero di elementi di un vettore deve essere sempre dichiarato costante.

  5. #5
    Utente di HTML.it L'avatar di zaion
    Registrato dal
    Mar 2002
    Messaggi
    258
    Si ok, in c la stringa è un vettore di caratteri.

    ma kentaromiura sta usando i puntatori.
    Forse si può capire meglio se la variabile si
    dichiara così:


    char *c;


    Comunque sarebbe interessante risolvere questo problema con i
    puntatori. (se si da una dimensione precisa alla stringa allora
    il problema non sussiste.)


    By Zaion
    bye bye

  6. #6
    nota:
    Non e' vero che un array deve essere di dimensione costante. In precedenza (ANSI C ISO C89) e' stato definito che un vettore deve avere sempre una dimensione costante ma il nuovo standard ISO C99 ha chiaramente definito che l'array può avere anche dimensione arbitraria (na cosa tipo: char array[strlen(p) + 1]. L'unica limitazione e' che un array del genere non puo' essere inizializzato (e mi pare anche normale dopo tutto). I vantaggi? se vi serve uno stupido buffer temporaneo perche' utilizzare il lento e tedioso heap quando si può fare tutto con lo stack, sicuro e performante?


    Per quanto riguarda la domanda originale: se vuoi fare un input di massimo 40 caratteri puoi fare cosi:

    unsigned counter;
    int ch;
    char array[40];

    for (counter = 0; counter != 40 && (ch = getchar()) != '\n'; ++counter)
    array[counter] = ch;


    bye
    There are 10 kinds of people in the world: who knows the binary numeration and who not

  7. #7

    si ..bravi

    ma se il problema sussiste in un buffer overflow,
    e voi mi dite di mettere un dimensione fissa,allora
    posso andare a sporcare le variabili nell'area di
    memoria sottostante al vettore!!
    provate a fare una struttura;
    dopo aver dichiarato il vettore costante
    dichiarate un altro vettore...
    magicamente il mio algoritmo va a
    scrivere anche nel vettore sottostante..
    comunque zaion mi ha dato(involontariamente)
    la soluzione a scuola:usare la
    strlen()
    immettendo dopo al carattere un '\0'..
    comunque grazie a tutti...!!!

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 © 2025 vBulletin Solutions, Inc. All rights reserved.