新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
肯定会释放了,函数调用完成后,函数里的所有局部变量将会被释放。但是你写的这个程序根本就有问题。你所返回的只是一个地址空间,所以一直没变,释放指的是将这个地址里的内容清除掉,以便使其它的数据可以用这个地址的内存。如果没释放的话,其它的数据就用不了这个址址了。
尼木网站制作公司哪家好,找创新互联建站!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。创新互联建站从2013年成立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联建站。
c的内存泄露主要是出在指针上面。对于变量,系统都会在用完后自动释放的。
变量释放就是告诉系统你不用这块地址了,别的程序可以对那块地址进行赋值等操作,因此那块地址的值你就不可控了,即使你再对它赋值,也可能被别的程序改变,产生意想不到的结果。
只要访问过p指针,都会变化(连续printf两次,结果不一样)
f函数结束,p指向地址已经释放,但是该内存单元依然存有原来的数据,我个人认为,访问p之后,由于一些系统内部操作,导致p指向内存单元被回收,内部机制不清楚,纯属个人猜测
1、当成普通数组使用,用for循环即可赋值。
2、例程:
#include
#include
int
main(void)
{
int
*a=NULL;
int
i;
a=malloc(sizeof(int)*10);/*动态创建一个有10个int元素的数组*/
if
(a==NULL)
{
/*a==NULL表示空间分配失败*/
fprintf(stderr,"MEMORY
ERROR");
return
-1;
}
for
(i
=
0;
i
10;
i++)
{
a[i]=i;
/*对数组进行赋值操作*/
}
free(a);/*动态分配的空间需要用free()函数释放*/
return
0;
}
p最开始赋值为NULL,可以把他拿到函数test中又被重新赋值为指向变量a,而指针作为函数参数的时候是直接改变内存中他指向那个位置的值,你说的a确实被释放了(这个可以在主函数中test(p);下面调用一次a,会报错说a没定义,说明a已经被释放了),但是赋值给指针p的那段地址还在那,并且那个地址里面存放的值是45,所以在最后输出p指向的位置的值的时候就把45输出了。
n = scanf("%d",n);
这一句有问题
1. scanf 函数是有返回值的,它的返回值可以分成三种情况
1) 正整数,表示正确输入参数的个数。
例如执行 scanf(“%d %d”, a, b);
如果用户输入”3 4”,可以正确输入,返回2(正确输入了两个变量);
如果用户输入”3,4”,可以正确输入a,无法输入b,返回1(正确输入了一个变量)。
2) 0,表示用户的输入不匹配,无法正确输入任何值。如上例,用户如果输入”,3 4”,返回0。
3) EOF,这是在 stdio.h 里面定义的常量(通常值为-1),表示输入流已经结束。在Windows下,用户按下CTRL+Z(会看到一个^Z字符)再按下回车(可能需要重复2次),就表示输入结束;Linux/Unix下使用CTRL+D表示输入结束。
你这个输入一个返回值就是1,因此n也会一直等于一