函数中分配后的空指针 我在C++中遇到了指针问题。我声明了指针数据并在函数中初始化它,但在我的程序离开函数后,指针数据为NULL。我提供以下代码的输出。但是,当我删除行getline(cin,desc)时;指针数据从不为空。为什么会这样?在函数中使用getline()形式得到的字符串分配内存时应该怎么做 #包括 #包括 使用名称空间std; 结构数据 { 字符串描述; 整数; }; 无效函数1(整数、字符串描述、数据*数据) { 数据=新数据; 数据->描述=描述; 数据->编号=编号; printf(“期间:%p\n”,数据); } int main(int argc,char const*argv[] { 整数; string desc=“TEXT TEXT”; getline(cin,desc); scanf(“%i”和编号); 数据*数据; printf(“之前:%p\n”,数据); 功能1(编号、描述、数据); printf(“之后:%p\n”,数据); 返回0; }

函数中分配后的空指针 我在C++中遇到了指针问题。我声明了指针数据并在函数中初始化它,但在我的程序离开函数后,指针数据为NULL。我提供以下代码的输出。但是,当我删除行getline(cin,desc)时;指针数据从不为空。为什么会这样?在函数中使用getline()形式得到的字符串分配内存时应该怎么做 #包括 #包括 使用名称空间std; 结构数据 { 字符串描述; 整数; }; 无效函数1(整数、字符串描述、数据*数据) { 数据=新数据; 数据->描述=描述; 数据->编号=编号; printf(“期间:%p\n”,数据); } int main(int argc,char const*argv[] { 整数; string desc=“TEXT TEXT”; getline(cin,desc); scanf(“%i”和编号); 数据*数据; printf(“之前:%p\n”,数据); 功能1(编号、描述、数据); printf(“之后:%p\n”,数据); 返回0; },c++,pointers,null,C++,Pointers,Null,输出: 之前:0x0 期间:0x7f9ab25008c0 之后:0x0 但是,如果我删除行:getline(cin,desc)输出: 之前:0x103de4068 期间:0x7f8ed2c04aa0 之后:0x103de4068 您正在按值传递指针,因此该函数从main获取指针的副本,并且只能影响它自己的指针副本,而不能影响main中的指针 因此,无论是在调用函数之前还是之后,指针都只是一个未初始化的值,因此它可能会发生不可预测的变化(从技术上讲,打印出来,或以任何其他方式使用其值,都会导致未定

输出

之前: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: %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};
}

您定义了一个指针,但没有为其分配任何内容:

Data *data;
根据定义,
*数据可以指向“它想要的”任何东西。因此,
之前的
之后的
值只是随机地址

但是,在
函数1
中,您要做的第一件事是为一个新的数据对象分配内存,并用它覆盖您现有的指针,因此显然,您在
期间的
值是不同的,并且是三者中唯一有意义的值

唉,由于指针是按值传递的,所以在
function1
中执行的所有操作结束后都会被扔掉


我假设,您想要的是将
新数据
语句移动到
main

或者,将指针传递给指针。这可能比指针和引用的组合更容易理解(但会导致代码稍微混乱)。
Data *data;