one1name 2021-01-08 21:29 采纳率: 100%
浏览 39
已结题

C语言动态内存释放问题?

#include <stdio.h>
#include <malloc.h>
int main(void)
{
	
	int a[5];//占用了20个字节,每四个字节被当成了一个int变量 
	
	int len;
	int * pArr;
	int i;
	 
	
	printf("请输入元素个数:");
	scanf("%d", &len);
	
	//构造动态一维数组 
	pArr = (int *)malloc(4 * len);//pArr是数组名,int *是数组类型 malloc()是数组长度 
	 
	//对动态一维数组进行操作,如:赋值.... 
	for (i=0; i<len; ++i)
		scanf("%d", &pArr[i]);
	
	//对动态一维数组进行输出
	printf("动态一维数组的内容为:\n");
	for (i=0; i<len; ++i)
		printf("%d\n", pArr[i]);
	
	
	
	printf("每个元素的大小为%d\n", sizeof(*pArr));//输出了第一个动态变量的大小 
	free(pArr);
	printf("%d\n", pArr[0]);
	printf("%d\n", pArr[1]);
	printf("%d\n", pArr[2]);
	printf("%d\n", pArr[3]);

这是我学习c语言中动态内存时候的一个问题,就是在free(pArr)之后,我输出的数组元素为什么会有不是乱码的值、

这下边使我测试的输出结果:为什么会有不适乱码的输出呢,释放了内存不是应该清空数据了么,

请输入元素个数:10
0 1 2 3 4 5 6 7 8 9
动态一维数组的内容为:
0
1
2
3
4
5
6
7
8
9
每个元素的大小为4
12517712
0
12517712
0
4
5
6
7
8
9
-1962934133

--------------------------------
Process exited after 8.157 seconds with return value 0
请按任意键继续. . .

各路大神能帮我解答,学生党一枚,自学c可能有点不太容易,希望大神帮忙解决

  • 写回答

7条回答 默认 最新

  • include_iostream_ 2021-01-08 23:36
    关注

    对于第二个问题可以分为两个子问题来回答。

    1) 可以用sizeof获取数组大小吗?

    可以也不可以。数组本质上只是连续存储空间在内存中起始点的标识,C语言中数组是可以获取大小的,但数组可以隐式退化为指针,尝试对指针sizeof只会得到指针大小,不能得到指针指向数组的大小。你的程序中,pArr从一开始就是指针而不是数组,那么就是无法通过sizeof获取其所指向数组的大小的。其原因是,sizeof是在编译期执行的运算符,无法提前获知pArr在运行期能指向多大空间(做预测也是不可能的,因为malloc调用有可能失败。如果编译器针对malloc来决定sizeof的值,那在malloc失败时整个程序将陷入严重的正确性问题)。

    关键在于:pArr只是指向了一个动态生成的内存空间,这段内存空间被解释为一个数组,可以按数组来访问,但它本质上仍然是一个指针而不是真正的数组。

    2) 如何获取数组大小?

    对于形如int arr[20];这样的数组,用sizeof(arr)/sizeof(int)显然是足够的。对于malloc获取的伪数组,最好的办法就是用额外变量保存长度信息。诚然CRT在堆上的控制结构里保存了长度信息,但是首先,获取那个值比较麻烦;其次,那个值和你malloc传入的值不见得相同。内存分配时都是按若干字节(通常是2的幂)的整数倍去分配的,而不是按字节。这意味着,如果你试图获取13字节内存,而你的OS以8字节为单位分配,那么实际上这个malloc将会获得16字节而不是13字节。

    一句话:最好还是老老实实用一个额外变量存储这个信息。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 1月2日
  • 已采纳回答 12月25日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效