2013-01-07 186 views
1

我用C++編寫了一個簡單的指針代碼,我得到了圍繞「str」的堆棧損壞的運行時錯誤。 我知道它會給出這個錯誤,如果你試圖去到一個未分配的地方在一個數組中,但在這種情況下,當指針變爲'\ 0',而停止。 是否可以繼續在內存中指向'\ 0'的ptr? 在此先感謝! : - )用指針損壞的C++堆棧

下面的代碼:

#include <iostream> 
    using namespace std; 
    #define SIZE 5 
    void CHANGE(char str[]); 

    void CHANGE(char str[]) 
    { 
     char *ptr=str; 
     while(*ptr!='\0') 
     { 
      if(((*ptr>='a')&&(*ptr<='z'))|| ((*ptr>='A')&&(*ptr<='Z'))) 
      { 
       if(*ptr=='z') 
        *ptr='a'; 
       else if(*ptr=='Z') 
        *ptr='A'; 
       else 
        (*ptr)++; 

      } 

      ptr++; 
     } 

    } 

    void main() 
    { 

     char str[SIZE]; 
     cout<<"please enter a sring\n"; 
     cin>>str; 
     CHANGE(str); 
     cout<<str<<"\n"; 
    } 
+4

難道是你使用的字符串長度超過四個字符(因爲零期吃了你聲明的5)?你測試什麼輸入? – WhozCraig

+3

你有使用字符數組而不是'std :: string'的一些要求嗎?無論如何,你的'main'簽名是非標準的,你認爲''a''通過''z''和''A''到'Z''具有連續的字符代碼,這是不能保證的。 – chris

+8

NO NO NO NOOOOOOOOOO當你意味着常量使用STD :: STRING時,請不要使用宏定義。和一本書,得到一個BOOOOOK –

回答

1

因爲你定義大小5,你可以輸入最多4號,因爲你正在考慮它作爲一個空結尾的字符串。所以如果你輸入的字符數大於SIZE,你的CHANGE函數將嘗試訪問沒有被分配的內存。 希望它有幫助。

-2
int main() 

它適合我。順便說一句,SIZE應該高得多。

#define SIZE 10000 
+2

***爲什麼***'10000'而不是'10001'? – Johnsyweb

+2

因爲9999還不夠,10001太過分了嗎? – WhozCraig

+0

/我檢查日曆。不,仍然沒有2013-04-01。 – Johnsyweb