首先是错误代码:
#include
<
stdio.h
>
int main() ... {
int *p;
*p = 3;
printf("p=%d ",*p);
return 3;
}
执行结果
:
[vserver@vserver test]$ gcc 05 .c
[vserver@vserver test]$ . / a. out
p = 3
Segmentation fault (core dumped)
[vserver@vserver test]$
int main() ... {
int *p;
*p = 3;
printf("p=%d ",*p);
return 3;
}
执行结果
:
[vserver@vserver test]$ gcc 05 .c
[vserver@vserver test]$ . / a. out
p = 3
Segmentation fault (core dumped)
[vserver@vserver test]$
分析:
int *p; /*定义一个用来存放int 变量地址的变量*/
int b;/*定义一个用来存放值的变量*/
p=&b;/*因为变量b申明后会在内中中分配一个地址,所以可以把这个地址赋给p
就是在p变量的地址中写入b的地址值*/
*p=3;/*实际上是通过间接寻址找到b,把3写入b变量地址中*/
/*再来分析你的程序*/
int main(){
int *p;/*定一个用来存放地址的变量*/
*p = 3;/*在没有给定地址的情况下,也就是不知道地址在哪却向其中写入数据3,这时肯 定会出现你说的错误,因为是试图改写任意地址里的内容,一般linux下p中 的初始值为内存首地址0,也就是操作系统内核地址区*/
printf("p=%d/n",*p);
return 3;
}
修改后程序:
int
main()
...
{
int *p;
p=(int *)malloc(sizeof(int));
*p=5;
printf("%d ",*p);
free(p);
return 3;
}
int *p;
p=(int *)malloc(sizeof(int));
*p=5;
printf("%d ",*p);
free(p);
return 3;
}