2013-01-07 168 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