我是C ++的新手。我正在尝试将char指针作为函数的out参数。但是函数中所做的更改并没有反映在main函数中。我做错了什么?
void SetName( char *pszStr )
{
char* pTemp = new char[10];
strcpy(pTemp,"Mark");
pszStr = pTemp;
}
int _tmain(int argc, _TCHAR* argv[])
{
char* pszName = NULL;
SetName( pszName );
cout<<"Name - "<<*pszName<<endl;
delete pszName;
return 0;
}
答案 0 :(得分:51)
您的指针正被复制到堆栈中,并且您正在分配堆栈指针。如果要更改指针,则需要传递指针指针:
void SetName( char **pszStr )
{
char* pTemp = new char[10];
strcpy(pTemp,"Mark");
*pszStr = pTemp; // assign the address of the pointer to this char pointer
}
int _tmain(int argc, _TCHAR* argv[])
{
char* pszName = NULL;
SetName( &pszName ); // pass the address of this pointer so it can change
cout<<"Name - "<<*pszName<<endl;
delete pszName;
return 0;
}
这将解决您的问题。
但是,这里还有其他问题。首先,您在打印前取消引用指针。这是不正确的,你的指针是一个指向字符数组的指针,所以你想打印出整个数组:
cout<<"Name - "<<pszName<<endl;
你现在拥有的只会打印第一个角色。 Also,您需要使用delete []
删除数组:
delete [] pszName;
但是,更大的问题出在你的设计中。
该代码是C,而不是C ++,即使这样,它也不是标准的。首先,您正在寻找的功能是main
:
int main( int argc, char * argv[] )
其次,您应该使用references而不是指针:
void SetName(char *& pszStr )
{
char* pTemp = new char[10];
strcpy(pTemp,"Mark");
pszStr = pTemp; // this works because pxzStr *is* the pointer in main
}
int main( int argc, char * argv[] )
{
char* pszName = NULL;
SetName( pszName ); // pass the pointer into the function, using a reference
cout<<"Name - "<<pszName<<endl;
delete pszName;
return 0;
}
除此之外,如果可以的话,通常最好只返回:
char *SetName(void)
{
char* pTemp = new char[10];
strcpy(pTemp,"Mark");
return pTemp;
}
int main( int argc, char * argv[] )
{
char* pszName = NULL;
pszName = SetName(); // assign the pointer
cout<<"Name - "<<pszName<<endl;
delete pszName;
return 0;
}
有一些东西可以让这一切变得更好。 C ++有一个string class:
std::string SetName(void)
{
return "Mark";
}
int main( int argc, char * argv[] )
{
std::string name;
name = SetName(); // assign the pointer
cout<<"Name - "<< name<<endl;
// no need to manually delete
return 0;
}
如果你想要的话,如果这一切都可以简化,那么:
#include <iostream>
#include <string>
std::string get_name(void)
{
return "Mark";
}
int main(void)
{
std::cout << "Name - " << get_name() << std::endl;
}
您应该处理格式化以使事物更具可读性。您的运营商之间的空间有助于:
cout<<"Name - "<<pszName<<endl;
cout << "Name - " << pszName << endl;
就像英语单词之间的空格有助,sodoesspaces betweenyouroperators。 :)
答案 1 :(得分:8)
在这种情况下,您也可以使用对指针的引用。此外,您可能想要了解原始代码中的其他2个错误(请参阅我在代码段中的注释)。
void SetName( char *& pszStr )
{
char* pTemp = new char[10];
strcpy(pTemp,"Mark");
pszStr = pTemp;
}
int _tmain(int argc, _TCHAR* argv[])
{
char* pszName = NULL;
SetName(pszName);
// Don't need '*' in front of pszName.
cout<< "Name - " << pszName << endl;
// Needs '[]' to delete an array.
delete[] pszName;
return 0;
}
答案 2 :(得分:4)
由于您标记为C ++,为什么不传入std :: string引用并填充它?
void GetName(std::string &strName)
{
strName = "Mark";
}
或者只是返回一个std :: string:
std::string GetName2()
{
return "Mark";
}
并称之为
std::string strName, strName2;
GetName(strName);
strName2 = GetName2();
assert(strName == "Mark");
assert(strName2 == "Mark");
//strName.c_str() returns the const char * pointer.
然后你不必担心释放任何记忆。
答案 3 :(得分:2)
您所写的不是C ++,而是使用new而不是malloc的C代码,而不是免费的删除。如果您真的想编写C ++代码,请重新开始。阅读像Accelerated C++这样的书,它将教你现代惯用的C ++。