【问题标题】:Initializing unsigned char pointer inside function returns null pointer [duplicate]在函数内部初始化无符号字符指针返回空指针[重复]
【发布时间】:2020-04-08 03:46:49
【问题描述】:

这是我的测试代码

#include <QCoreApplication>
#include <QDebug>

void fillData(unsigned char *data){
    data = new unsigned char[10];
    for (int i = 0; i < 10; i++){
        data[i] = static_cast<unsigned char>(i);
    }
    qDebug() << "Returning wiht non null data?" << (data == nullptr);
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    unsigned char *data = nullptr;
    qDebug() << "Is data null" << (data == nullptr);
    fillData(data);
    qDebug() << "Is data null" << (data == nullptr);

    return a.exec();
}

我需要在函数中填充一个指向字节数组的指针,并且我在我的应用程序中注意到我一直为空。所以我写了这个 MWE。它重现了这个问题,因为这个程序的输出是

Is data null true
Returning wiht non null data? false
Is data null true

当我希望他们的问题返回 false 时。我不知道我做错了什么。

【问题讨论】:

  • data 作为副本传递。
  • 那么当它已经是一个指针时,我如何确保将它作为参考传递呢?很抱歉这个菜鸟问题,但我积极避免使用这些数据类型,现在我需要在我当前的应用程序中使用它
  • @aarelovich 在 C 中将指针传递给指针,在 C++ 中传递对指针的引用。显然你也可以返回指针。

标签: c++ qt reference pass-by-reference


【解决方案1】:

该函数处理原始变量的副本。函数参数是它的局部变量。

您必须在 C++ 含义或 C 含义中通过引用传递指针。例如

C++ 引用传递

void fillData(unsigned char * &data){
    data = new unsigned char[10];
    for (int i = 0; i < 10; i++){
        data[i] = static_cast<unsigned char>(i);
    }
    qDebug() << "Returning wiht non null data?" << (data == nullptr);
}

C 引用传递

void fillData(unsigned char **data){
    *data = new unsigned char[10];
    for (int i = 0; i < 10; i++){
        ( *data )[i] = static_cast<unsigned char>(i);
    }
    qDebug() << "Returning wiht non null data?" << (*data == nullptr);
}

在这种情况下,函数调用看起来像

fillData( &data );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-12
    • 2017-07-24
    • 2016-01-22
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 2015-01-02
    相关资源
    最近更新 更多