返回时指针的值是垃圾

时间:2012-11-03 16:25:31

标签: c++ pointers for-loop

  

可能重复:
  Can a local variable’s memory be accessed outside its scope?

#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,它运行良好,但如果我用循环中的int替换const,如* b + i那么它就不起作用!!

P.S。这不是HW !!我“是”一个长期的程序员,因为忘记了所有这一切而感到羞耻。

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

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

char *b = new char[11];

答案 1 :(得分: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;
             }

答案 2 :(得分:0)

最后但并非最不重要的是,*b+i表示由bi)引发的(*b)+i指向的对象的值,而不是*(b+i)如你所愿。

答案 3 :(得分: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;
}

然后你没有返回一个局部变量,而是用反向字符串返回原始数组。