我是C的新手.我试图使一个char指针作为函数的out参数.但功能的变化并没有体现在主要功能中.我究竟做错了什么?
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; }
解决方法
你的指针被复制到堆栈上,你正在分配堆栈指针.如果要更改指针,则需要传递指针到指针:
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,即使这样也不是标准的.首先,您要查找的功能主要是:
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;
就像英文单词之间的空格有所帮助,在你的间隙之间.