在函数中分配后的空指针
Null pointer after allocating in function
我在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
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 将指针分配给另一个指针时会发生什么情况?
- 运行时错误:引用绑定到类型为"int"的空指针
- C++将一个指针分配给另一个指针时执行的类型检查
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 我似乎无法为指针分配一个数组,然后更改数组的内容
- 为什么我在空指针错误(链表)中获取成员访问权限
- 从向量到空指针的 memcpy(反之亦然)不起作用
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- C++为 void 指针分配一个字符串
- 当我在 C++ 中将派生类的指针分配给指针时,地址会更改
- 成员访问是否在空指针上定义C++?
- 尝试将对象插入空指针数组时出现分段错误
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- MPI 集合通信中的指针分配
- 是否允许向空指针添加零?
- 如何为C++字符串分配空指针参数?
- 在函数中分配后的空指针
- 正在为空指针未定义行为分配特定的内存
- 是否空指针分配分区有一个错误