2012-10-08 21 views
5

Ya he visto algunas preguntas aquí en stackoverflow pero ninguno de ellos ha resuelto mi problema ...Run-Time Check Fracaso # 2 - Stack alrededor de la variable se corrompió

tengo ese código en C:


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

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

cuando corro el programa, tuve el error:

Run-Time Check fracaso # 2 - Stack alrededor del variabl e 'str' estaba dañado.

ahora, realmente no sé lo que estoy haciendo mal allí ... :(

Respuesta

5

la matriz str sólo puede contener un solo char dada su inicialización. la llamada a scanf() será una sobreescritura de los límites del str causando un comportamiento indefinido, en este caso, la corrupción de la pila. es necesario decidir qué tan grande la matriz str debe ser y limite la cantidad de caracteres leídos para evitar que se sobrepase el búfer norte.

Para utilizar scanf() se especifica el número máximo de caracteres a leer:

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.*/ 

También es posible usar fgets() pero tendría que quitar el carácter de nueva línea después.

2

No debe sobrescribir una constante con la entrada del usuario. Reemplazar char str[] = "" con char * str = malloc(<enough bytes for any possible input) o incluso aprender acerca de las API más seguras.

1

Solo está asignando un byte para almacenar la entrada. La línea

char str[] = ""; 

Asigna cero bytes para el contenido de cadena y un byte para su terminador nulo. En su lugar, haga algo como

char str[100]; 

O cualquiera que sea la longitud de entrada máxima.

0

Esta respuesta es para todos los que llegaron a C++ desde Java/C# o algún otro lenguaje moderno orientado a objetos.

Para mí este tema pasó por la siguiente razón:

he creado mi propia personalizada clase de 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 
} 

Mi intuición era que propA y propB simplemente habrá propiedades privadas, invisibles desde el código fuera de esta clase.

El problema resultó ser que no he puesto propA y propB en MyClass.h. El compilador no sabe cuánta memoria debe asignar cuando MyClass está siendo instanciado por las personas que llaman.

simplemente I añadieron las propiedades a la cabecera MyClass.h:

MyClass.h (fijo)

class MyClass { 
    int64 propA, propB; 

public: 
    void work(); 

};