您好 有人可以解释为什么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
答案 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;
数组名也是一个指针(指向数组第一个元素的指针。