2012-10-08 138 views
5

我已經看到了一些問題,在這裏計算器,但它們都沒有解決我的問題......運行時檢查失敗#2 - 圍繞堆棧變量被損壞

我在C代碼:


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

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

當我運行該程序,我有錯誤:

運行時檢查失敗#2 - 堆棧圍繞variabl e'str'被破壞了。

現在,我真的不知道我在做什麼不對勁的地方... :(

回答

5

陣列str只能容納一個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(),但需要事後刪除新行字符。

2

你不應該覆蓋恆定的用戶輸入。與char * str = malloc(<enough bytes for any possible input)更換char str[] = ""甚至瞭解更安全的API。

1

你只分配一個字節來存儲輸入。該行

char str[] = ""; 

爲字符串內容分配零字節,爲其空終止符分配一個字節。相反,做一些像

char str[100]; 

或無論最大輸入長度將。

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 
} 

我的直覺是,propApropB將只是私人性質,從這個類之外的代碼不可見。

問題原來是我沒有把propApropB放在MyClass.h。 當MyClass被調用者實例化時,編譯器不知道它應該分配多少內存。

我簡單地添加的屬性的報頭MyClass.h

MyClass.h(固定)

class MyClass { 
    int64 propA, propB; 

public: 
    void work(); 

}; 
相關問題