1

可能重复:
可以在其范围之外访问局部变量的内存吗?

#include <iostream>
#include <string>

using namespace std;

char* reverse(char* input) 
{
    char b[11];

    for (int i=0; i<11; i++)    {b[10-i]=input[i];}
    for (int u=0; u<11; u++)    {cout<<b[u];}
    cout<<endl;
    return &b[0];
}

int main ()
{
     char ali[]="ali is good";
     char *a=&ali[0];
     char *b=reverse(a);

     for (int i=0; i<11; b++, i++)  
        {
            cout<<*b+i<<endl;
        }
     cout<<endl;
     system("pause");
     return 0;
}

这是一个反转字符串的简单程序,当您在函数中打印结果时效果很好,但是当将字符串的指针传递给 Main 然后打印它时,它会打印类似垃圾的东西。

为什么奇怪?因为如果我打印 *b+2 或 *b+5 或任何我喜欢的 const ,它工作得很好,但如果我在 *b+i 这样的循环中用 int 替换 const 则它不起作用!

PS这不是硬件!!我“是”一个长期的程序员,忘记了这一切让我感到羞耻。

有任何想法吗?

4

4 回答 4

1

函数内声明的变量是自动存储持续时间对象,并在函数末尾超出范围(因此不再有效)。要分配比函数寿命更长的存储,您需要动态存储持续时间对象(这些是通过 new 分配的):

char *b = new char[11];
于 2012-11-03T16:28:31.737 回答
1

您永远不应该返回指向局部变量的指针,这就是您看到错误的原因。

局部变量在堆栈上分配。当变量超出范围时,内存被释放。

现在您正在尝试访问已被取消分配的变量,因为它已超出范围(并因此从堆栈中删除)

 for (int i=0; i<11; b++, i++)  
                        {
                            cout<<*(b+i)<<endl;
                        }

为什么要同时增加 b 和 i?

你应该只增加 i 而不是基指针地址(b)

总之,这是您应该使用的程序

#include<iostream>
   using namespace std;

             void reverse(char* input,char * output) 
             {


                for (int i=0; i<11; i++)    {output[10-i]=input[i];}
                for (int u=0; u<11; u++)    {cout<<output[u];}
                cout<<endl;

            }

             int main ()
             {
                 char ali[]="ali is good";
                 char *a=&ali[0];
                 char *b=(char *)malloc(sizeof(ali));
                 reverse(a,b);

                 for (int i=0; i<11;  i++)  
                    {
                        cout<<*(b+i)<<endl;
                    }
                 cout<<endl;
                 system("pause");
                 return 0;
             }
于 2012-11-03T16:29:54.550 回答
0

最后但并非最不重要的一点是,表示由(即)引发*b+i的对象的值,而不是您希望的值。bi(*b)+i*(b+i)

于 2012-11-03T16:33:26.310 回答
0

试试这个

char* reverse(char* input) 
{
  int len = strlen(input);
  for (int i=0; i<len/2; ++i) 
  {
    char tmp = input[i];
    input[i] = input[len-i-1];
    input[len-i-1] = tmp;
  }
  return input;
}

那么您不会返回局部变量,而是返回带有反转字符串的原始数组。

于 2012-11-03T16:49:13.587 回答