<C语言>关于free()函数的问题。

一.关于malloc函数和free函数。#include<stdio.h>#include<stdlib.h>#defineN20voidprint_star(intn)... 一.关于malloc函数和free函数。
#include <stdio.h>
#include <stdlib.h>
#define N 20
void print_star(int n) //这个打印星号的函数没有什么卵用,主要是为了让自己看得更加舒服......
{
int i;
printf("\n");
for(i=0;i<n;i++)
printf("*");
printf("\n");
}
void print_V1doublearray(double A[],int V1) //打印数组的一个函数
{
int i;
printf("\n");
for(i=1;i<=V1;i++)
{
printf("%f\t",A[i-1]);
if(i%5==0)
printf("\n");
}
printf("\n");
} //主函数开始
int main()
{
int *std;
int size,i;
printf("please input a number to choose the size of the array!\n");
size=get_int(); //设定数组的大小
std=(int*)malloc(size*sizeof(int));
print_V1intarray(std,size); //打印最开始的未赋值的数组
print_star(50); //打印“一串星号”看得更明了
printf("Now, please input the value of the array in turn.\n");
for(i=0;i<size;i++)
{
printf("this is the %d element.\n",i+1);
scanf("%d",(std+i));
}
print_V1intarray(std,size); //打印赋值后的数组
print_star(50);
free(std);
print_V1intarray(std,size); //打印赋值后free前的数组
return 0;
}
这时,前面的数组会非常轻松的打印出来,但是后面的数组再次打印的时候里面的数值就已经恢复了内存之前的样子。
当我设定大小为6,输入1 2 3 4 5 6 时。
打印的结果依次为:
5658000 0 5636440 0 0 0
1 2 3 4 5 6
5658000 0 5636440 0 5 6
有些数便会了原来的样子,而有些数没有。
当我设定大小为7,输入1 2 3 4 5 6 7时。
2512272 0 2490712 0 0 0 0
1 2 3 4 5 6 7
2512272 0 2490712 0 5 6 7
为什么会出现这种【四个以后】的元素就无法被还原的问题呢?
对了,第二个打印数组的函数应该是,我弄成浮点形的了。。
void print_V1intarray(int A[],int V1)
{
int i;
printf("\n");
for(i=1;i<=V1;i++)
{
printf("%d\t",A[i-1]);
if(i%5==0)
printf("\n");
}
printf("\n");
}
还有一个函数我也没有补充上去
int get_int(void)
{
char ch;
int i;
while(scanf("%d",&i)!=1)
{
while((ch=getchar())!='\n')
putchar(ch);
printf("is not an integer.\n");
}
return i;
}
展开
 我来答
若以下回答无法解决问题,邀请你更新回答
478617
推荐于2016-05-17 · TA获得超过875个赞
知道小有建树答主
回答量:725
采纳率:100%
帮助的人:91.7万
展开全部
一般在调试模式下malloc()申请的内存被初始化为0xCD,free()后,内存被设置成0xDD,所以在调试模式下刚申请int的数值为0xCDCDCDCD,即-842150451,释放渗顷后的数值是0xDDDDDDDD,即-572662307。
在Release模式下,为加快速度,不会更改内存数据,所以任何数据都是可能的,具体数薯皮据和C语言的实现有关,前数喊差面的四个数据可能是指针,指向下一个可以被分配malloc()的地址,所以在释放后就被改回来了
追问
那么这段代码里对于free()函数的使用方式应该是没有错的吧??
追答
原则上free()后就不能使用该地址保存数据了,不然可能会发生未知的错误
所以一般在free()后,就将该地址设置为NULL
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式