c ++奇怪的行为从char *函数返回char数组

时间:2014-02-10 08:58:31

标签: c++ arrays winapi pointers

如何在不使用char和char *数组的情况下使用windows api。我想只使用字符串。

第二个问题

 char * nextdir(char * cstr) {


string mystring(cstr);
mystring.erase(mystring.find("*.*\\"),4);
mystring.append("\\*.*");
char nextdiir[MAX_PATH]="0";
strncpy( nextdiir, mystring.c_str(), sizeof( mystring ) );
cout<<"NEXTDIIR function="<<nextdiir<<endl;
return nextdiir; //}

下一个dir是一个数组!我怎么能从函数中返回它? 如果我把它投射到char *数组会发生什么?

我的问题是使用nextdir返回值的其他函数工作奇怪!

void recursive(char * searchdir){   
cout<<"searchdir="<<searchdir<<endl;}

当我做的时候

recursive(nextdiir(foo)); //now the data printed is not the same but garbage! not like the data printed in call to nextdiir function!!

所以我得到了例如

NEXTDIIR function=c:\windows\*.*
searchdir=garbage
//garbage is unknown characters!

如何解决?

另一个问题!!

1)是因为我将char数组名称转换为char *

2)如何使用没有此char和char *混乱的windows api。只能使用字符串? 3)char数组和char *之间有什么区别? char数组名也是指向第一个元素的常量指针然后有什么区别??? 4)如何从c中的函数返回char数组?在c ++中? 5)char *const char *之间的差异是什么?它们都是相同的,因为指向的值是不可改变的!

请帮忙

2 个答案:

答案 0 :(得分:2)

您正在返回指向局部变量nextdiir的指针。当函数返回时,该变量不再存在,为您留下悬空指针。取消引用它是未定义的行为。

为什么不返回std::string?然后使用std::string::c_str()方法获取指向其基础数据的const char*指针。

std::string nextdir(const char * cstr) {
  string mystring(cstr);
  // do your stuff
  return mystring;
}

答案 1 :(得分:0)

很多问题......

  

如何在不使用char和char *数组的情况下使用windows api。我想只使用字符串。

这将很难,Win Api需要一些函数指向char *数组的指针,你可以在这里使用std::vector<char> vec(REQUIRED_SIZE);传递&vec[0]到你的api函数,并将&vec[0]分配给你的std::string将结果导入std::string

  

第二个问题

char nextdiir[MAX_PATH]="0"; 

是函数的本地函数,因此不允许返回其指针(它将是UB)。您可以按照上面的方式创建std::vector<char>并根据需要进行修改,并将结果作为std::string(&vec[0])返回。

  

另一个问题!!

     

1)是因为我将char数组名称转换为char *?

不知道该演员在哪里,但你有一个如上所述的UB。

  

2)如何使用没有此char和char * mess的windows api。

MFC CString允许您使用GetBuffer(0)或GetBufferSetLength(100)访问内部缓冲区。 std :: string不允许你安全地修改内部缓冲区,这就是为什么最好使用std :: vector。实际上std::vector<TCHAR>会更好,如果您使用UNICODE构建,其中TCHAR将是wchar_t。

  

3)char数组和char *有什么区别?

两者都指向char类型的数组,所以差别不大。

  

char数组名称也是指向第一个元素的常量指针然后有什么区别???

如果是const char* nm = "alabama";则表示您无法修改nm数组内容

  

4)如何从c中的函数返回char数组?在c ++中?

要安全地返回一个char数组,你应该确保它的生命周期比你的函数生命周期长。这意味着您必须在函数内部分配内存,或者将已分配的内存传递给您的函数。

  

5)char *和const char *之间的差异是什么?它们都是相同的,因为指向的值是不可改变的!

char*是一个char类型的数组,可以在代码中修改,const char*是一个只能读取的char类型数组。