在函数中分配后的空指针

Null pointer after allocating in function

本文关键字:空指针 分配 函数      更新时间:2023-10-16

我在C++中遇到指针问题。我声明了指针数据并在函数中初始化它,但是在我的程序离开函数后,数据指针为 NULL。我在代码下面提供输出。但是,当我删除行getline(cin,desc)时;指针数据从来都不是NULL。为什么会这样?我应该怎么做才能使用字符串 getline() 在函数中分配内存?

#include <cstdio>
#include <iostream>
using namespace std;
struct Data
{
    string desc;
    int number;
};
void function1(int number, string desc, Data *data)
{
    data = new Data;
    data -> desc = desc;
    data -> number = number;
    printf("DURING: %pn", data);
}
int main(int argc, char const *argv[])
{
    int number;
    string desc = "TEXT TEXT";
    getline(cin, desc);
    scanf("%i",&number);
    Data *data;
    printf("BEFORE: %pn", data);
    function1(number,desc,data);
    printf("AFTER: %pn", data);
    return 0;
}

输出

之前: 0x0

期间:0x7f9ab25008c0

之后:0x0

但是,如果我删除行:getline(cin,desc);输出

之前: 0x103de4068

期间: 0x7f8ed2c04aa0

之后:0x103de4068

您按值传递指针,因此该函数从 main 获取指针的副本,并且只能影响其自己的指针副本,而不会影响 main 中的指针。

因此,在

调用函数之前和之后,指针只是一个未初始化的值,因此它可能会不可预测地变化(并且,从技术上讲,将其打印出来或以任何其他方式使用其值都会导致未定义的行为)。

通过引用传递指针,让函数修改原始指针:

void function1(int number, string desc, Data *&data)
{
    data = new Data;
    data -> desc = desc;
    data -> number = number;
    printf("DURING: %pn", data);
}

然后,当你理顺了这个问题时,你可能想完全停止使用原始指针(几乎)。几乎总是有更好的做事方法。在这种情况下,您当前在 function1 中的代码可能应该在构造函数中:

struct Data {
    string desc;
    int number;
    Data(string desc, int number) : desc(desc), number(number) {}
};

。然后在 main 中,您只需定义对象的一个实例:

int main() { 
    int n;
    std::cin >> n;
    Data d{"TEXT TEXT", n};
}

定义一个指针,但不为其分配任何内容:

Data *data;

根据定义*data可以指向任何"它想要"的东西。因此,BEFORE值和AFTER值只是随机地址。

但是,在function1中,您要做的第一件事是为新的 Data 对象分配内存,并用该对象覆盖现有指针,因此显然您的 DURING 值是不同的,并且是三者中唯一有意义的值。

唉,由于你按值传递指针,一旦它结束,你所做的一切都function1扔掉。

我假设,你想要的是将new Data语句移到你的main