可能重复:
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 !!我“是”一个长期的程序员,因为忘记了所有这一切而感到羞耻。
有什么想法吗?
答案 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
表示由b
(i
)引发的(*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;
}
然后你没有返回一个局部变量,而是用反向字符串返回原始数组。