我有这段代码可以按预期编译和工作:
#include <iostream>
using namespace std;
int fun(int* p){
*p = 20;
return 1;
}
int main(){
int* number;
*number =10;
cout << "before: "<<*number<<endl;
fun(number);
cout << "after: "<<*number<<endl;
return 1;
}
虽然以下内容给出了分段错误:
#include <iostream>
using namespace std;
int fun(int* p){
*p = 20;
return 1;
}
int main(){
int test=1; //ADDITION
int* number;
*number =10;
cout << "before: "<<*number<<endl;
fun(number);
cout << "after: "<<*number<<endl;
return 1;
}
我正在使用g++ test.cpp -o test
有人可以解释一下这种行为的来源吗?
答案 0 :(得分:8)
number
未指向main()
中的有效内存位置。只是程序声明了一个指针number
,它可以保存整数类型的地址。但是,它未分配/初始化为指向任何整数的位置。
int* number = new int;
*number = 10;
由于该程序正在管理资源,因此应使用delete
返回这些资源。
delete number;
如果幸运的话,这两个程序都会出现分段错误。
答案 1 :(得分:7)
在两个程序中,您都取消引用未初始化的指针。在第一个你很幸运,它没有崩溃。
int* number; // number points to a random location - it's not initalized
*number =10; // You write to a random location
使用此:
int number;
number = 10;
...
fun(&number);
或者,使用new:
分配intint * number = new int;
*number = 10;
...
delete number; // always delete what you new
答案 2 :(得分:2)
由于int* number
未初始化为有效指针,因此两个程序都有未定义的行为。这只是抽签的运气,一方失败而另一方则没有。尝试
int* number = new int;
答案 3 :(得分:2)
int* number;
*number =10;
number
是指向int的指针。你需要分配内存,以便它可以指向有效的内存!
int *number = new int;
*number = 10;
现在好了!
答案 4 :(得分:1)
行为来自这样的陈述:
int* number;
*number =10;
取消引用未初始化的指针后,您已进入“未定义的行为”国家/地区。你继续在程序的其余部分中执行此操作,但在*number = 10
未定义之后整个事情的行为如何。它可能会起作用,它可能会崩溃它可能会告诉你1 + 1 = 15或其他什么。简单地说:你不能解除引用(或访问后面的数据)未初始化的指针。
干杯,
保
答案 5 :(得分:1)
我不认为“int test = 1”在这种情况下具有任何意义。但是,整数指针在初始化时指向随机数(表示随机存储器位置)。尝试执行以下操作:使用number = new int()替换* number = 10的出现次数; *数= 10;进行这样的初始化时,将从堆分配给指针。并且不要忘记使用“删除”操作符删除程序末尾的指针。
答案 6 :(得分:1)
您忘了为number
指针分配空间。发生这种情况时,程序行为未定义。事实恰恰相反,在一种情况下它会运行,但不会在后期运行。
将变量更改为plain int,
int number = 10;
或对其进行new
int *number = new int[1];
*number = 10;