加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何使用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;

就像英文单词之间的空格有所帮助,在你的间隙之间.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读