gpt4 book ai didi

c++ - 在函数中分配后的空指针

转载 作者:行者123 更新时间:2023-11-30 02:41:32 25 4
gpt4 key购买 nike

我对 C++ 中的指针有疑问。我声明了指针 data 并在函数中对其进行了初始化,但是在我的程序离开函数之后,数据指针为 NULL。我在代码下方提供输出。但是,当我删除行 getline(cin, desc); 时,指针 data 永远不会为 NULL。为什么会这样?我应该如何分配函数中的内存,字符串 got 形式 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

DURING: 0x7f9ab25008c0

AFTER: 0x0

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

BEFORE: 0x103de4068

DURING: 0x7f8ed2c04aa0

AFTER: 0x103de4068

最佳答案

您正在按值传递指针,因此该函数从 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};
}

关于c++ - 在函数中分配后的空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28035781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com