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

Mar*_*ark 10 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;
}
Run Code Online (Sandbox Code Playgroud)

GMa*_*ckG 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;
}
Run Code Online (Sandbox Code Playgroud)

这将解决您的问题.


但是,这里还有其他问题.首先,您在打印前取消引用指针.这是不正确的,你的指针是一个指向字符数组的指针,所以你想打印出整个数组:

cout<<"Name - "<<pszName<<endl;
Run Code Online (Sandbox Code Playgroud)

你现在拥有的只会打印第一个角色.此外,您需要使用delete []删除数组:

delete [] pszName;
Run Code Online (Sandbox Code Playgroud)

但是,更大的问题出在您的设计中.

该代码是C,而不是C++,即便如此,它也不是标准的.首先,您正在寻找的功能是main:

int main( int argc, char * argv[] )
Run Code Online (Sandbox Code Playgroud)

其次,您应该使用引用而不是指针:

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;
}
Run Code Online (Sandbox Code Playgroud)

除此之外,如果可以的话,通常最好只返回一些东西:

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;
}
Run Code Online (Sandbox Code Playgroud)

有一些东西可以让这一切变得更好.C++有一个字符串类:

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;
}
Run Code Online (Sandbox Code Playgroud)

如果你想要的话,如果这一切都可以简化,那么:

#include <iostream>
#include <string>

std::string get_name(void)
{
    return "Mark";
}

int main(void)
{
    std::cout << "Name - " << get_name() << std::endl;        
}
Run Code Online (Sandbox Code Playgroud)

您应该处理格式化以使事物更具可读性.您的运营商之间的空间有助于:

cout<<"Name - "<<pszName<<endl;

cout << "Name - " << pszName << endl;
Run Code Online (Sandbox Code Playgroud)

就像英语单词之间的空格有助于,sodoesspaces betweenyouroperators.:)

  • +1,回答直接问题,并用代码阐明更大的问题. (2认同)

Kei*_*Kei 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;
 }
Run Code Online (Sandbox Code Playgroud)