7
votes

Échec du chèque d'exécution # 2 - La pile autour de la variable a été corrompue

J'ai déjà vu quelques questions ici à Stackoverflow, mais aucun d'entre eux n'a résolu mon problème ...

J'ai ce code en C: P>


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

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

c

0 commentaires

4 Réponses :


2
votes

Vous ne devez pas écraser une constante avec l'entrée de l'utilisateur. Remplacer char Str [] = "" " avec char * str = malloc ( ou même en apprendre davantage sur les API plus sûres.


0 commentaires

6
votes

Le tableau str ne peut contenir qu'un seul Char Compte tenu de son initialisation. L'appel à scanf () écrasera les limites Le str provoquant un comportement non défini, dans ce cas, corrompre la pile. Vous devez décider de la taille de l'ensemble du tableau STR doit être et limiter le nombre de caractères lire pour empêcher le dépassement de la mémoire tampon.

utiliser scanf () Vous spécifiez le nombre maximum des caractères à lire: xxx

Vous pouvez également utiliser fgets () mais il faudrait supprimer le caractère de nouvelle ligne par la suite.


0 commentaires

1
votes

Vous ne faisant que allouer un octet pour stocker l'entrée. La ligne xxx

alloue des octets zéro pour le contenu de la chaîne et un octet pour son terminateur NULL. Au lieu de cela, faites quelque chose comme xxx

ou quelle que soit la longueur d'entrée maximale.


0 commentaires

0
votes

Cette réponse est pour tous ceux qui sont venus à C ++ de Java / C # ou d'autres langues modernes orientées objet modernes.

Pour moi, cette question s'est produite pour la raison suivante: p>

J'ai créé ma propre personnalisée C ++ classe. p>

myclass.h strong> p> xxx pré>

myclass.cpp strong> p>

class MyClass {
    int64 propA, propB;

public:
    void work();

};


0 commentaires