当前位置:首页 » 编程语言 » c语言指针创建及释放
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言指针创建及释放

发布时间: 2023-08-01 05:34:23

1. c语言中是如何释放内存单元的;原理又是什么

C管理内存大致可以理解为两种,分配在栈上的,一个是分配在堆上的。

临时变量,动态变量,分配在栈上,运行完,直接弹出栈,就没了。
分配在堆上的内存,释放的时候,基本上可以理解为,指针不指这里了。也就失去了对这块内存的控制。其实所谓的释放。字面意思容易让人理解错。
有些机器有些操作系统,会在释放的时候清空这段内存,但是这种做法效率不高,但是安全,很少有机器这么做,多数都是所谓释放,就是不让你控制这块内存了而已。

2. C语言数组指针内存释放

//用指针的指针当二维数组请参考以下代码
#include<stdio.h>
#include<stdlib.h>
intmain(){
int**b;
b=(int**)malloc(sizeof(int*)*4);//二维数组b有4行

for(inti=0;i<4;i++)//替每行分配存储空间
b[i]=(int*)malloc(sizeof(int)*3);//二维数组b每行3列

for(inti=0;i<4;++i)for(intj=0;j<3;j++)
b[i][j]=i*j;

for(inti=0;i<4;++i){
for(intj=0;j<3;j++)
printf("%5d",b[i][j]);
printf(" ");
}

for(inti=0;i<4;i++)
free(b[i]);//释放每行的存储空间
free(b);//释放b
return0;
}

3. 关于C语言指针释放的问题

这段话中有好几个错误。
1. 如果有int A, int *B = &A, 这时执行free(B) 一定引起内存错误。
free只能使用在动态分配的内存上,不能用在堆栈或静态数据上。
类似 int A,或 static int A,这样的变量定义,是在编译时已经确定了内存位置。
动态分配是在运行时,从堆中临时分配的内存块(用malloc,或new)。这些内存块需要用 free(malloc)或delete(new)释放;

2. 变量名实际是内存地址的代称,这句也不完全对
在程序中,变量名代表了“这个地址上的数值”,只有对变量使用&操作,才能得到变量的地址

3. free(B)应该释放了B这个指针变量
如果指针变量存放了一个动态得到的地址,free(B)释放的是变量B的数值(不是变量B的地址),由于变量B的数值是一个动态分配得到的地址,所以free释放的是动态地址。

4. C语言 指针的释放问题

前提是这个指针使用malloc、realloc、calloc动态申请来的,当你不使用这个指针时,就释放掉,在什么地方释放都是可以的,关键是这个指针没有被修改过

5. c语言指针怎么理解,什么时候会用到指针,要注意哪些方面

cpu自己有运算器和寄存器,通过总线与存储器件相连,在执行运算时,
需要将数据冲存储器件上面将参与运算的数据读入,运算完成后再送出到
存储区。那么cpu读入时需要访问存储器件的某个单元,需要指定这个单元
的编号,我们管这个编号叫存储地址。
比如:int a[10],*p; p=&a[3];a就是一个拥有10个整型数据的数据区
的首地址,变量p是存放地址的,称为指针型变量,赋值时需要取相应存储
区的地址,p=&a[3];就是取数组a的第4个单元的地址给p,那么p就拿到了
这个单元的地址,*p=5;就相当于a[3]=5;的操作,p++;后p指针就指向a[4]。
在操作大块数据时,一般记录首地址(数组指针),然后根据首地址再加
上偏移量来访问整个数据,在你程序中写a[3]时,计算机就会取a数组对应
的首地址再加3个整型偏移量来访问相应数据。用指针p访问a数组的好处
是,不用每次计算a加多少偏移访问数据,而是使p指向某数据后可以p++
或p--来访问前一个或后一个数据。
注意:
1.指针存放地址用,不是存储实际数据的,它是用来找数的,在
程序中要注意这点,往往出问题的是,指针还没有赋值就用来操作,或
用指针来存放数据,如:int *p=15,s[10]={ 0,15,{0} };的
p指针赋值有问题,这样计算机会把15当成地址存放到p变量中,以后用
*p访问得到的数据就不是你想要的数据了。(应该类似:p=s+1; *p=15;)
2.指针访问数据区一般需要程序来控制不要越界,比如定义了10个单元
的数据区,你不能让指针超出这10个单元的范围,否则得到的数据就是
不靠谱的。
3.指针的定义只是开设了可以访问数据区或数组的变量,数据区和数组
需要你的程序另行开设,然后把数据区或数组的某个单元的地址赋值给
指针变量,不要认定义了能访问数组的指针,数组就定义好了。
4.指针存放的地址最好不要用来与其他地址比较,除非你能确认地址比
较的结果肯定是你想要的。
5.举例来说,int a[10],*p=a;中a和p都是指针(地址),但a和p是不同的
在编译器眼中,a是一个数据区的首地址,是一个标记,你程序中使用a
时,编译器会知道用数据区的首地址来替换操作,而p是你自己程序开
设的变量,可以在程序中操作比如p++; p=a;等,但作为记号的a就不能
在程序中操作了,如a++; a=p;就是错的了。
6.子程序如果参数是指针型的,这个参数由子程序开设的指针型临时
变量存储,这个临时变量可以进行操作,但不会返回给调用者的指针型
变量。
如:int a[10],*p; int f(int *s) { s++; } main() { p=a; f(p); }
s再怎么加减都不会影响p。