C语言指针向内存的原理
指针变量 的值是一个地址,指向一个内存单元 即分配给某变量的地址。
释放内存就是为了避免程序由于不断申请而不释放,导致程序本身,或者别的程序没有存储空间去存放指令和数据。3 p指向的是p这个地址中存放的变量。
指针变量,本身就是一个存放地址的整数变量。当一个指针保存了某个有效的地址,我们就形象的称之为“它指向了地址为xxx的内存”,从这个原理上来看,显然是指向了a的首字节地址。
你可以将指针变量看做一般的整数变量来理解,用来保存一个整数(地址是个整数),只是,该整数代表着某地址,在这里是a的地址。
所以由这你应该明白,C语言中的内存分配只是应用程序自己的一个逻辑地址。当然物理内存与这里的内存是由操作系统进行映射的。 如你所说,int 占4个字节,那么整型指针一次就移动4个字节。
因此这种方法是十分危险的。给指针赋值一般有两种方法,一种是将已经存在的变量的地址传递给指针,格式为:p=另一种是首先为指针申请指向的合法内存,c语言中用函数malloc(),然后给已申请的地址赋值,如*p=6。
看C语言的书中说“释放存储空间”,是什么意思?什么叫做释放,为什么叫…
释放内存指的是在计算机系统中将已被分配但当前未被使用的内存空间返回给操作系统或内存管理系统,使其能够被其他程序或进程使用。当程序运行时,会向操作系统请求分配一定的内存空间来存储数据和执行代码。
释放空间是指用“动态申请内存函数”申请成功的空间,不是你写的代码占用的空间。
即是说C/C++ 都需要主动释放动态申请的内存。试着解释下为什么要主动释放动态申请的内存:动态申请的内存,存储在堆中,编译器不会自己回收,回收的意义:通俗讲就是告诉编译器,这片内存可以使用。
分配在堆上的内存,释放的时候,基本上可以理解为,指针不指这里了。也就失去了对这块内存的控制。其实所谓的释放。字面意思容易让人理解错。
在c语言中,在某个大括弧引起来的区域(如函数、子程序的)内你定义了一个变量,这个变量在程序跳出这个反括号时,就会被自动舍弃。c++中的情况也类似。
关于C语言指针释放的问题
1、如果指针变量存放了一个动态得到的地址,free(B)释放的是变量B的数值(不是变量B的地址),由于变量B的数值是一个动态分配得到的地址,所以free释放的是动态地址。
2、像用于指向动态分配的空间,如结构体的指针,在delete掉动态分配的空间后,最好把指针赋为0.这样如果再对此指针进行解引用,delete等操作,编译就会报错,可以防止程序出错。
3、如果指向了在这个函数中定义的临时自动型数组,那必然存在返回局部数组指针的问题,就是你说的内存释放问题。这样虽然指针被返回了,但它指向的内容已经不受代码控制了,很危险。
4、free后p指向的内存是释放状态。虽然这个指针仍指向这个内存,但是因为其被释放,很快会被其它malloc再分配到。值就会丢失,就是说内存不可靠了。在使用free后,一定要对p进行设置为NULL,或0以表示这个指针不再是有效的。
5、lz,首先说明,我用的vs2010可以成功编译,不知道你的是什么编译器,是什么错误信息。
c语言指针指向的局部变量释放?
1、会自动释放,指针也是一样的。局部变量的作用域是定义该变量的函数或定义该变量的复合语句。只在定义它的函数或复合语句范围内有效,只能在定义它的函数或复合语句内才能使用它们。
2、C语言中可以使用free函数释放指针。free函数:原型:void free(void ptr);功能:释放malloc(或calloc、realloc)函数给指针变量分配的动态内存。
3、在C语言中,局部变量的作用域只在函数内部,在函数返回后,局部变量的内存就会被释放。如果函数只是返回局部变量,那么这个局部变量会被复制一份传回被调用处。
4、所以一直没变,释放指的是将这个地址里的内容清除掉,以便使其它的数据可以用这个地址的内存。如果没释放的话,其它的数据就用不了这个址址了。c的内存泄露主要是出在指针上面。对于变量,系统都会在用完后自动释放的。
5、p是指向局部变量的指针,当函数退出时,局部变量会被释放,这时,p所指向的位置就不一样是原来的数。因为fun()函数返回的值被计算机的临时变量存放,当赋值给p的时候,p是指向临时变量的地址,所以还可以读取出100。