C++ char*指针传递给函数并删除

Nar*_*rek 4 c++ pointers

我有以下代码:

#include <iostream>
using namespace std;

void func(char * aString)
{
    char * tmpStr= new char[100];
    cin.getline(tmpStr,100);
    delete [] aString;
    aString = tmpStr;
}

int main()
{
    char * str= new char[100];
    cin.getline(str,100);
    cout<< str <<endl;
    func(str);
    cout<< str <<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么第二个cout不打印第二个输入字符串?如何更改此代码才能使用它?

Mic*_*l J 12

正如GregS所说,简单的答案是使用引用声明你的函数:

void func(char *&aString)
Run Code Online (Sandbox Code Playgroud)

然而,它并不是真正的最佳解决方案.在C++中,您通常会避免使用简单数组并使用容器.

#include <iostream>
#include <string>

void func(std::string &s)
{
    std::getline(std::cin, s);
}

int main()
{
    std::string str;
    func(str);
    std::cout << str << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


Did*_*set 6

因为第二个cout将打印出指向的内容str.并且str,主函数中的指针在调用之前和之后将具有相同的值func.

实际上,在func函数中,您正在更改aString变量的值.但这是另一个变量而不是str主要变量.

如果要str更改值,则必须func通过引用或指针将其传递给它.(注意你写的是用指针传递字符.我的意思是你必须通过指针传递指针:void func(char **str_ptr)或者通过引用void func(char *&str_ref))

如果你真的在做C++,你应该使用std :: string而不是旧的C字符串.

通过指针传递指针的示例:

func(char ** aString)
{
    char * tmpStr= new char[100];
    cin.getline(tmpStr,100);
    delete [] *aString;
    *aString = tmpStr;
}
Run Code Online (Sandbox Code Playgroud)

另外你应该这样称呼它: func(&str);