C++ C++;cout指针

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

你好 有人能解释一下为什么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()
{
     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()