如果一个指针没有被初始化,那么程序就不知道它指向哪里。它可能指向一个非法地址,这时,程序会报错,在 Linux 上,错误类型是 Segmentation fault(core dumped),提醒我们段违例或内存错误。它也可能指向一个合法地址,实际上,这种情况更严重,你的程序或许能正常运行,但是这个没有被初始化的指针所指向的那个位置的值将会被修改,而你并无意去修改它。用一个例子简单的演示一下:
#include "stdio.h"
int main(){
int *p;
*p = 1;
printf("%d\n",*p);
return 0;
}
这个程序可以编译通过,但是运行的话会报错,报错信息如下:
要想使这个程序运行起来,需要先对指针 p 进行初始化:
#include "stdio.h"
int main(){
int x = 1;
int *p = &x;
printf("%d\n",*p);
*p = 2;
printf("%d\n",*p);
return 0;
}
这段代码的输出结果如下:
可以看到,对指针进行初始化后,便可以正常对指针进行赋值了。
/* 方法1:使指针指向现有的内存 */
int x = 1;
int *p = &x; // 指针 p 被初始化,指向变量 x ,其中取地址符 & 用于产生操作数内存地址
/* 方法2:动态分配内存给指针 */
int *p;
p = (int *)malloc(sizeof(int) * 10); // malloc 函数用于动态分配内存
free(p); // free 函数用于释放一块已经分配的内存,常与 malloc 函数一起使用,要使用这两个函数需要头文件 stdlib.h