我有两个文件,main.c
和main2.c
。我的经验告诉我他们应该做同样的事情,但事实并非如此。
main.c
在main
例程之外声明一个全局变量。然后,在main
例程中,声明并定义指针以指向该全局变量。全局变量已更改,并且局部变量的值将打印到屏幕。
main2.c
做同样的事情,但是将局部到全局的定义和全局变量值的变化卷入另一个函数change_number
。
我无法理解为什么这种方法失败了。 main.c
和main2.c
是几个小时的错误修复,文档和教程阅读的结果,显然,在这里阅读SO。
我对指针的理解是我称之为基本的:它指向一个内存位置。在常规变量的情况下,指针将指向该变量的内存位置。几个指针可以指向相同的内存位置,但是一个指针不能指向多个位置。
在C中没有传递引用这样的东西,但据我所知,这不是通过引用传递的,因为所有变量和指针都在函数外部定义。请赐教。
//File: main.c
#include <stdio.h>
#include <stdlib.h>
int global_number;
int main() {
int *local_number;
local_number = &global_number;
global_number = 9;
printf("local_number = %d\n", *local_number);
return 0;
}
输出:“local_number = 9”。这是预期的结果。
//File: main2.c
#include <stdio.h>
#include <stdlib.h>
int global_number;
void change_number(int *number) {
number = &global_number;
global_number = 9;
}
int main() {
int *local_number;
change_number(local_number);
printf("local_number = %d\n", *local_number);
return 0;
}
输出:“分段故障”。这显然不是故意的。代码运行正常,直到printf()。
答案 0 :(得分:3)
你永远不会在第二个程序中初始化local_number
。它没有指向任何地方,并且在访问时会崩溃。尝试
int *local_number = &global_number;
那么值应该改变
要让change_number也初始化local_number,传递local_number的地址并更改指向指针:
void change_number( int **number ) {
*number = &global_number;
global_number = 9;
}
...
int *local_number;
change_number(&local_number);