C ++ cout指针

时间:2010-10-15 23:59:15

标签: c++

您好 有人可以解释为什么func(char * p)中的第二个 cout 不起作用:

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

编辑: 我在Windows上使用DEV C ++ 4.9.9.2

4 个答案:

答案 0 :(得分:4)

这里的一个大问题是strhex正在返回指向局部变量(buffer[])的指针。该变量超出了函数末尾的范围,因此返回值指向可以随时覆盖的未定义内存内容。

答案 1 :(得分:1)

您的整个代码无效。这两个函数都返回指向本地数组的指针,这些数组在函数返回后没有指向任何有效的数组。这会导致未定义的行为。由于p的值是这些无效指针之一,因此您无法在任何特定时间依赖它 - 在func()期间内存可能会被覆盖。您需要new[]delete[]相应的内存,或者最好使用正确的C ++数据结构,如std::string

答案 2 :(得分:0)

看起来它正在工作但是main中的第二个cout没有打印出一个值,因为你正在返回一个空缓冲区。

答案 3 :(得分:0)

添加其他答案:

您无需重置pbuffer以指向数组的开头,然后返回其值:

pbuffer=buffer;
return pbuffer;
你可以说

return buffer;

数组名也是一个指针(指向数组第一个元素的指针。