7

ここstackoverflowですでにいくつかの質問を見てきましたが、どれも私の問題を解決していません...

私はCでそのコードを持っています:


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

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

プログラムを実行すると、次のエラーが発生しました。

実行時チェックの失敗 #2 - 変数「str」の周りのスタックが壊れていました。

今、私はそこで何が間違っているのか本当にわかりません... :(

4

4 に答える 4

6

配列は、その初期化が与えられたstr場合、1 つのみ保持できます。charへの呼び出しscanf()は境界を上書きし、str未定義の動作を引き起こします。この場合、スタックが破損します。バッファ オーバーランを防ぐために、配列の大きさを決定し、str読み取る文字数を制限する必要があります。

使用scanf()するには、読み取る最大文字数を指定します。

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

使用することもできますfgets()が、後で改行文字を削除する必要があります。

于 2012-10-08T15:26:30.120 に答える
2

ユーザー入力で定数を上書きしないでください。char str[] = ""より安全な APIに置き換えるchar * str = malloc(<enough bytes for any possible input)か、それについて学ぶことさえできます。

于 2012-10-08T15:23:38.363 に答える
1

入力を格納するために 1 バイトのみを割り当てています。この線

char str[] = "";

文字列の内容に 0 バイトを割り当て、ヌル ターミネータに 1 バイトを割り当てます。代わりに、次のようなことをしてください

char str[100];

または、最大入力長が何であれ。

于 2012-10-08T15:27:13.367 に答える
0

この回答は、Java/C# またはその他の最新のオブジェクト指向言語から C++ に移行したすべての人を対象としています。

私にとって、この問題は次の理由で発生しました。

独自のカスタム 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
}

私の直感は、このクラスの外部のコードからは見えない、単なるプライベート プロパティになるということでしpropAた。propB

propA問題は、私がとを入れていないことであることが判明しましpropBMyClass.hMyClassコンパイラーは、呼び出し元によってインスタンス化されたときに、割り当てる必要があるメモリの量を認識していません。

プロパティをヘッダーに追加しただけですMyClass.h

MyClass.h (固定)

class MyClass {
    int64 propA, propB;

public:
    void work();

};
于 2015-07-06T11:29:56.800 に答える