在函数中分配后为空指针

时间:2015-01-20 00:15:11

标签: c++ pointers null

我在C ++中遇到指针问题。我声明了指针 data 并在函数中初始化它,但在我的程序离开后,函数数据指针为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: %p\n", data);
}

int main(int argc, char const *argv[])
{
    int number;
    string desc = "TEXT TEXT";
    getline(cin, desc);
    scanf("%i",&number);
    Data *data;
    printf("BEFORE: %p\n", data);
    function1(number,desc,data);
    printf("AFTER: %p\n", data);
    return 0;
}

输出

  

BEFORE:0x0

     

期间:0x7f9ab25008c0

     

AFTER:0x0

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

  

之前:0x103de4068

     

期间:0x7f8ed2c04aa0

     

AFTER:0x103de4068

2 个答案:

答案 0 :(得分:3)

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

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

通过引用传递指针以获取修改原始指针的函数:

void function1(int number, string desc, Data *&data)
{
    data = new Data;
    data -> desc = desc;
    data -> number = number;
    printf("DURING: %p\n", 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};
}

答案 1 :(得分:0)

您定义指针并且不为其指定任何内容:

Data *data;

根据定义,*data可以指向任何事物&#34;它想要&#34;。因此,BEFOREAFTER值只是随机地址。

然而,在你的function1中,你要做的第一件事是为新的Data对象分配内存,并用它覆盖现有的指针,所以显然你的DURING的值是不同的,唯一的一个这三者之间有意义。

唉,既然你按指标传递你的指针,你就会在function1结束时把你所做的一切都扔掉。

我认为,您想要的是将new Data语句移到您的main

相关问题