返回时指针的价值是垃圾
Value of Pointer is Garbage when Returned
可能的重复:
可以在其范围之外访问本地变量的内存吗?
#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;
}
然后,您没有返回本地变量,而是用反向字符串返回原始数组。
相关文章:
- 在 const 函数中通过引用和指针返回之间的区别
- 指向 std::unrodered_map 中元素的指针返回'Read access violation'
- 为什么要为指针返回类型返回一系列字符?
- Visual C 运行时:Malloc将指针返回到已经使用的内存(包含实际字符串)
- 将原始指针返回到智能指针
- 从函数中的指针返回对象,例如链接列表
- 将指针返回使用New创建的数组数组
- 查找并将指针返回向量中的对象
- 函数可以将指针返回其自己的类型
- 指针返回值的地址
- 为什么静态指针返回函数中有一个"静态"键?
- 从弱指针返回类型返回共享指针
- 如何将C++引用和指针返回转换为 C++/CLR
- 从指针返回对象时出现意外的析构函数调用
- 阵列指针返回垃圾
- (C )当在同一类中调用时,污点指针返回正确的值,而从MAIN调用时为0
- C 从指针返回到成员功能
- 在构造函数以外的任何其他位置访问相机时,我的相机指针返回 null
- 从取消引用的指针返回原始指针
- 指针返回