返回时指针的价值是垃圾

Value of Pointer is Garbage when Returned

本文关键字:指针 返回      更新时间:2023-10-16

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

#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,它效果很好,但是如果我用like op *b i中的int替换const,那就不起作用!

P.S。这不是HW!我"是"长期的程序员,对我忘记了所有这一切感到羞耻。

有什么想法?

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

char *b = new char[11];

您切勿将指针返回到本地变量,这是为什么看到错误的原因。

局部变量分配在堆栈上。当变量脱离范围时,存储器被取消分配。

现在,您正在尝试访问已脱离分配的变量,因为它已经超出了范围(因此从堆栈中删除)

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

为什么同时增加B和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;
             }

最后但并非最不重要的一点是, *b+i表示由 i凸起的 b指向的对象的值(即 (*b)+i),而不是 *(b+i)

尝试一下

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;
}

然后,您没有返回本地变量,而是用反向字符串返回原始数组。