2012-10-08 5 views
5

ho già visto alcune domande qui a StackOverflow ma nessuno di loro ha risolto il mio problema ...Run-Time Check Failure # 2 - pila intorno alla variabile è stato danneggiato

ho quel codice in C:


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

int main() 
{ 
    char str[] = ""; 
    scanf("%[^\n]", str); 
    printf("Você digitou: %s\n", str); 
    system("pause"); 
} 

quando ho eseguito il programma, ho avuto l'errore:

Run-time check Failure # 2 - pila tutto il variabl e 'str' era corrotto.

Ora, io davvero non so cosa sto facendo male c'è ... :(

risposta

5

l'array str può contenere solo un singolo char dato la sua inizializzazione. la chiamata a scanf() saranno sovrascrivendo i limiti della str causando un comportamento indefinito, in questo caso corrompere lo stack. È necessario decidere quanto grande la matrice str dovrebbe essere e limitare il numero di caratteri letti per evitare il buffer overr n.

Per utilizzare scanf() di specificare il numero massimo di caratteri da leggere:

char str[1024]; 
if (1 == scanf("%1023[^\n]", str)) /* Check return value to ensure */ 
{         /* 'str' populated.    */ 
}         /* Specify one less than 'str' */ 
            /* size to leave space for null.*/ 

Si potrebbe anche usare fgets() ma avrebbe bisogno di rimuovere il carattere di nuova linea di seguito.

2

Non si dovrebbe sovrascrivere una costante con l'input dell'utente. Sostituire char str[] = "" con char * str = malloc(<enough bytes for any possible input) o addirittura conoscere le API più sicure.

1

Si sta allocando solo un byte per memorizzare l'input. La riga

char str[] = ""; 

Assegna zero byte per il contenuto della stringa e un byte per il terminatore null. Invece, fare qualcosa come

char str[100]; 

O qualunque sia la lunghezza massima di ingresso sarà.

0

Questa risposta è per tutti quelli che sono venuti in C++ da Java/C# o qualche altro linguaggio moderno orientato agli oggetti.

Per me la questione è accaduto per il seguente motivo:

ho creato la mia classe personalizzata C++.

MyClass.h

class MyClass { 

public: 
    void work(); 

}; 

MyClass.cpp

#include "MyClass.h" 
#include <iostream> 

class MyClass{ 
    int64 propA, propB; 

    public: 
     void work(); 

}; 

void MyClass::work() { 
    // some work that uses propA and propB 
} 

mia intuizione era che propA e propB sarà semplicemente proprietà private, invisibili dal codice esterno questa classe.

Il problema è risultato che non ho inserito propA e propB in MyClass.h. Il compilatore non sa quanta memoria deve allocare quando MyClass viene generato istanza dai chiamanti.

semplicemente aggiunto le proprietà all'intestazione MyClass.h:

MyClass.h (fisso)

class MyClass { 
    int64 propA, propB; 

public: 
    void work(); 

}; 
Problemi correlati