#include <stdio.h>
int a = 12345;
void test(int *temp)
{
temp = &a;
}
int main(int argc, char const *argv[])
{
int *b = NULL;
test(b);
printf("%d\n", a);
printf("%d\n", *b);
return 0;
}
return
12345
Segmentation fault
为什么段错误呢?
1
AoEiuV020 2021-11-01 17:24:24 +08:00
这不是老生常谈的传值传引用的问题么,c 语言入门书应该都有强调这些问题吧,
|
2
fkdog 2021-11-01 17:29:48 +08:00
test()里 temp 只是一个形参,
|
3
ReputationZh OP @fkdog 这个解释可以
|
4
Hallelu 2021-11-01 17:45:07 +08:00
temp = &a; 并没有改变 b 的指向
|
5
ch2 2021-11-01 17:49:56 +08:00
test(b);//这一行不起任何作用
|
6
ryd994 2021-11-01 18:02:13 +08:00 via Android
把书看懂 || gdb 里跑一趟
这两样你做了任一样就不会有这个问题 gdb 里跑一圈就明白的事 |
7
CreSim 2021-11-01 18:08:33 +08:00 via Android
显然你需要传指针的指针。
|
8
ligiggy 2021-11-01 18:16:11 +08:00
temp 是形参。因为传递的是 null ,要想赋值,可以传递 指针的指针,然后 new 一个对象同时赋值即可
传入 int **temp ,然后赋值为*temp = new int(a); |
9
0Vincent0Zhang0 2021-11-01 19:02:51 +08:00 via Android
int a = 12345 //申请一个存放 int 的盒子
int *b = NULL //申请了一个存放 int 盒子位置的 b 盒子,盒子里面放着 0 这个值 test(b) //把 b 盒子的内容 0 传给 test // 进入 test 后 temp = b 盒子的内容,就是 0 temp = &a //把 a 盒子的位置传给 temp printf("%d\n", a); //打印 a 盒子的内容 printf("%d\n", *b); //打印 b 盒子内容 0 所指向的盒子里面的内容,因为访问不到 0 位置的盒子内容,所以报错了。 在这里,test 无法改变 b 盒子的内容,因为传给 test 的只是 b 盒子的内容,而要改变 b 盒子的内容则需要传 b 盒子的位置。 例如这样改: void test(int **temp){ *temp = &a } test(&b); |
10
Jooooooooo 2021-11-01 19:26:06 +08:00
temp 变了啊
|
11
Brian1900 2021-11-01 22:17:48 +08:00
想要修改一级指针的值,需要将函数参数修改为二级指针,否则函数将拷贝一份新的一级指针,修改的是新指针的值而不是 b 的值
|
12
anzu 2021-11-02 10:53:33 +08:00
把指针全去了,就不影响理解了,b 还是 b 。所以很多语言表面上都隐藏了指针的概念。
|
13
GrayXu 2021-11-02 11:21:51 +08:00
《大一 C 语言课程》
|
14
Kasumi20 2022-04-26 16:34:57 +08:00
访问内存 0x0000000000000000 ,能不段错误吗?
|