如何使用char指针作为C函数的out参数
发布时间:2020-12-16 05:39:26 所属栏目:百科 来源:网络整理
导读:我是C的新手.我试图使一个char指针作为函数的out参数.但功能的变化并没有体现在主要功能中.我究竟做错了什么? void SetName( char *pszStr ){ char* pTemp = new char[10]; strcpy(pTemp,"Mark"); pszStr = pTemp;}int _tmain(int argc,_TCHAR* argv[]){ ch
我是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; 就像英文单词之间的空格有所帮助,在你的间隙之间. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |