C++ C++;cout指针
你好 有人能解释一下为什么func(char*p)中的secondcout不起作用:C++ C++;cout指针,c++,C++,你好 有人能解释一下为什么func(char*p)中的secondcout不起作用: #include <cstdlib> #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> using namespace std; char *strhex(char *str); char *func(char *p); int main
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
char *strhex(char *str);
char *func(char *p);
int main()
{
char *ptr;
char *p=strhex("d");
cout<<"main:"<<p<<endl;
cout<<func(p)<<endl;
system("PAUSE");
return 0;
}
char *func(char *p)
{
cout<<"func1:"<<p<<endl;
char buffer[500]="";
char *zbuffer = buffer;
cout<<"func2:"<<p<<endl; ///doesn't work
return zbuffer;
}
char *strhex(char *str)
{
char buffer[500]="";
char *pbuffer = buffer;
int len = strlen( str );
for( int i = 0; i < len ;i++ )
{
itoa(str[i],pbuffer,16);
pbuffer +=2;
};
*pbuffer = '\0';
pbuffer=buffer;
return pbuffer;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
char*strhex(char*str);
char*func(char*p);
int main()
{
char*ptr;
char*p=strhex(“d”);
cout这里的一个大问题是,strhex
返回一个指向局部变量的指针(buffer[]
)。此变量在函数结束时超出范围,因此返回值指向可以随时覆盖的未定义内存内容。这里的一个大问题是,strhex
返回指向局部变量的指针(buffer[]
)。此变量在函数结束时超出范围,因此返回值指向未定义的内存内容,这些内容可以随时被覆盖。您的整个代码不起作用。两个函数都返回指向本地数组的指针,这些指针在函数返回后不指向任何有效的内容。这会导致未定义的行为。因为p
的lue是这些无效指针中的一个,您不能依赖它在任何特定时间成为任何东西-该内存可能在func()
期间被覆盖。您需要new[]
和delete[]适当的内存,或者最好使用一个适当的C++数据结构,比如“代码> STD::String < p>您的整个代码不起作用。这两个函数都返回指向本地数组的指针,这些函数在函数返回后没有指向任何有效的。这导致了未定义的行为。指针,您不能依赖它在任何特定时间成为任何东西-该内存可能在func()
期间被覆盖。您需要new[]
和delete[]适当的内存,或者最好使用一个适当的C++数据结构,比如 STD::String < P>它看起来是有效的,但是主的第二个CUT因为没有返回一个空的缓冲区而没有打印出一个值。 看起来它在工作,但是主的第二个CUT不是打印出一个值,因为你是返回空缓冲区。
添加到其他答案:
无需重置pbuffer
以指向数组的开头,然后返回其值:
pbuffer=buffer;
return pbuffer;
你可以说
return buffer;
数组名称也是一个指针(指向数组第一个元素的指针。添加到其他答案:
无需重置pbuffer
以指向数组的开头,然后返回其值:
pbuffer=buffer;
return pbuffer;
你可以说
return buffer;
数组名也是一个指针(指向数组的第一个元素的指针)。你说的“不工作”是什么意思?返回一个指向局部变量的指针可能是个坏主意,但可能与你的问题无关。@Carl:实际上可能是确切的原因。strhex()中的buffer
占用的堆栈空间
将被func()
中的buffer
占用。您正在返回指向堆栈变量的指针。当您尝试使用这些指针时,这些指针无效。@Oli-很好。我只读了一个函数func()
。您所说的“不工作”是什么意思返回指向局部变量的指针可能不是个好主意,但可能与您的问题无关。@卡尔:实际上,可能是确切的原因。strhex()中的buffer
占用的堆栈空间将被func()中的buffer
占用
。您正在返回指向堆栈变量的指针。当您尝试使用这些指针时,这些指针无效。@Oli-很好。我只读取了一个函数func()
。