如何将char指针作为C ++函数的out参数

时间:2009-08-01 18:30:32

标签: c++

我是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;
}

4 个答案:

答案 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 ++。