【问题标题】:How to use call by reference to get value of a char** type variable from a function in C++?如何使用引用调用从 C++ 中的函数中获取 char** 类型变量的值?
【发布时间】:2018-08-15 10:52:16
【问题描述】:

我正在尝试使用以下代码打印以下内容:

int main() {
        char p[] = "hello";
        char*t = p;
        char**b = &t;
        std::string s = b[0];
        cout<<"string="<<s<<" b[0]="<<b[0];
}

我得到的输出符合预期:

字符串=你好 b[0]=你好

现在我想使用一个函数调用来实现同样的事情,在该函数调用中我通过引用传递一个变量:

void func(char**& p) {
        char *k = (char*)malloc(8*sizeof(char));
        k = (char*)"abc";
        p = &k;
}

int main() {
        char**j = NULL;
        func(j);
        std::string s1 = j[0];
        cout<<s1;
}

现在我得到一个空字符串。可能是什么原因以及如何解决?

【问题讨论】:

  • 阅读good C++ book。暂时别管指针,改用std::vectorstd::string
  • 虽然代码中存在多个问题,但我在VS2017中运行了您的代码,它确实打印了“abc”。所以,我想知道你在说哪个空字符串?
  • 是的,@PasserBy 是正确的。要么使用具有所有现代特性的 C++,要么使用 C。
  • @VishaalShankar 之所以称为未定义行为是有原因的
  • 我认为您在上一个问题中被告知使用强制转换几乎总是错误的。嗯,这次也错了。

标签: c++ string pointers char pass-by-reference


【解决方案1】:

你有(至少)两个问题:

  1. 首先是让p指向局部变量k
  2. 第二个更微妙,是您重新分配 k 丢失了您分配的原始内存并使k 指向。

当你有std::string 时,通常的说法是永远不要使用char 的数组或指向char 的指针作为字符串。你永远不应该在 C++ 中使用malloc,只能使用newnew[]。如果您需要new[],请考虑改用std::vector(当然字符串除外)。

【讨论】:

    【解决方案2】:

    没有办法编写这样的代码来遵循任何类型的良好编程标准。如果你认真学习如何编程,你应该放弃这种混乱并重写你的代码以正确的方式做事。即使在与遗留代码交互时,这种混乱也是没有必要的。

    但是以下“有效”

    void func(char**& p) {
        p = new char*;
        *p = new char[8];
        strcpy(*p, "abc");
    }
    

    请注意,我不需要使用演员表。

    【讨论】:

    • 感谢您的帮助
    猜你喜欢
    • 2013-09-17
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    相关资源
    最近更新 更多