C指针内存问题疑惑

来源:互联网 发布:软件驻场项目 编辑:程序博客网 时间:2024/05/16 08:25

这一段时间在细读c相关书籍,解决了以前的一些疑惑。。。

c语言中,定义一个指针的时候为这个指针开辟存储空间吗?

比如:int *p;
这个时候指针指向哪?是指向空?还是系统会为指针开辟一个整形的存储空间,然后让p指向这个地址?
。。如果指向空,那为什么定义了一个指针之后,可以直接*p=5呢?
    难道是在复制的时候开辟空间吗?
如果是在定义指针的时候系统就为这个指针开辟了一个存储空间,那如果int *p;了
之后,让p=&a;(就是让指针指向另外一个变量的地址,那它原来开辟的内存空间并没有释放,岂不是会造成内存泄露吗?)
难道是在让指针指向其他变量地址的时候自动释放的吗?那如果p=&a;p-&b;那岂不是a也会被释放吗?


   结合操作系统以及编译原理相关知识。。
内存都是用地址编好了每一“格的”,一个地址对应一“格”,定义一个指针时,系统为指针随机赋予一个内存大小范围内的地址,所以该指针肯定指向内存的某一个格。如果没有对指针进行赋值便使用(如p->next之类的),一般情况下在windows中运行时会提示非法访问内存,然后程序崩溃(调试时经常出现的情况),如果其他操作系统没有这样保护的话,可以使得指针任意访问内存,这是非常危险的,所以尽量别出现野指针。
1、应为定义的指针已指向一个地址,所以可以*p=5;
2、定义指针时并不是开辟内存空间,指定指针类型主要是为了在*p访问指针所指向内容时可以确定怎样读取这块连续的内存(例如int与long所占的直接是不同的)
3、也就是说int *p;之后直接p=5;虽然可以,但是有风险(比如下面的程序就出现异常)
#include<stdio.h>
#define IN   1
#define OUT  0
void main()
{
int *p;
p=5;
printf("%d\n",*p);
}
4、在定义int*p;时,p占有内存空间是系统分配的,但是位于栈区(栈区变量空间的存放依赖于变量的生命周期,如一个子函数的结束,该子函数里声明定义的变量也就会随之结束),存放系统随机给的一个值(实际上就是一个地址),这个值对应一处的空间,并非为空。
5而对应程序员动态分配内存空间,申请出来的是堆区上的空间。即p指向堆区的一块空间,本身自己的空间还是还是在栈区,一般动态分配了堆上的内存空间就要释放,否则会出现内存泄露。对于栈区的内存空间不需要你来管理,系统自动管理(包括分配空间,释放空间)。
拓展阅读:C内存管理方面的书籍