对c语言中malloc函数的不解
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<malloc.h>main(){charstr...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
main()
{
char str[10];
char *a;
a=(char *)malloc(10*sizeof(char));
gets(a);
//free(a);
puts(a);//结果意外:就算输了入一百个数,照样没事;照样输出;
printf("%s\n",a);
printf("%d\n",_msize(a));
}
问题1:动态内存函数好像没意义啊,我用简单的char str[10],与a=(char *)malloc(10*sizeof(char));他们不都是占用了10个大小内存么;难道malloc的存在就是有些东西只是临时存在一下?用完就释放了,但这样意义何在,比如我建立数组的目的就是要存东西,但考虑到怕浪费内存才想到用malloc,但malloc用free释放后,里面的数据又全没有了。再说也不灵活,我以为malloc会自动境加大小空间,结果还是要给个大小值,那何必!
问题2:a的值没有超,难道malloc的功能只是开了一个首地址,后面超的全部自动放在连续地址上么? 展开
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
main()
{
char str[10];
char *a;
a=(char *)malloc(10*sizeof(char));
gets(a);
//free(a);
puts(a);//结果意外:就算输了入一百个数,照样没事;照样输出;
printf("%s\n",a);
printf("%d\n",_msize(a));
}
问题1:动态内存函数好像没意义啊,我用简单的char str[10],与a=(char *)malloc(10*sizeof(char));他们不都是占用了10个大小内存么;难道malloc的存在就是有些东西只是临时存在一下?用完就释放了,但这样意义何在,比如我建立数组的目的就是要存东西,但考虑到怕浪费内存才想到用malloc,但malloc用free释放后,里面的数据又全没有了。再说也不灵活,我以为malloc会自动境加大小空间,结果还是要给个大小值,那何必!
问题2:a的值没有超,难道malloc的功能只是开了一个首地址,后面超的全部自动放在连续地址上么? 展开
8个回答
展开全部
malloc函数主要是用于功态申请内存。对于一些程序有可能会临时使用一些内存,用过后就不再需要了。虽然可以定义一个数组来实现,但如果需要的数量较大,且数量不固定,定义数组的方法会造成内存空间浪费。而用malloc可以实现动态申请内存,使用完后可以释放,能提高内存的利用率。当然如果是要始终保持数据的话,用数组会更方便。
用malloc函数申请内存是要指出数量的。且在使用时,不应超过申请的数量。如果对超过申请数量的内存单进行操作(特别是写入操作),是有可能因内存泄露而影响系统正常动行。
用malloc函数申请内存是要指出数量的。且在使用时,不应超过申请的数量。如果对超过申请数量的内存单进行操作(特别是写入操作),是有可能因内存泄露而影响系统正常动行。
2019-03-14
展开全部
问题1 : malloc的内存在堆上,堆的空间远大于栈空间,而且动态分配内存不是在于你提前知道你申请多少空间的内存,主要是需要申请内存大小的不确定性,需要运行的时候才能得知,譬如
char * GetMemory1(int num)
{
return (char*)malloc(num * sizeof(char));
}
char * GetMemory2()
{
char a[10] = {0};
return a;
}
这里,GetMemory1可以动态分配内存,可以申请不同大小的内存,返回的结果也是正常的地址,而GetMemory2里的变量是一个临时变量,返回出的指针在调用的时候就可能会崩溃。
问题2:a的内存只有10个字节,你输入100个字节没事是因为那段内存正好没被其他代码使用,而且也不是系统敏感内存位置,否则你输入100个字节输出1000个都有可能,一般堆内存在释放后数据会变成0xfe,你运气好,不然崩溃是没得商量的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
malloc就是用来进行动态分配的,由程序员自己分配内存,正常情况下一般变量是由系统自动分配到栈内存中的,而malloc也是动态在堆中分配
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2019-03-14
展开全部
malloc分配一段连续的内存
C/C++不进行越界检测, 意思是你分配一段10个单元的内存, 你依然可以访问10个单元后的内存, 如果运气好, 10个内存单元后的内存没有被使用, 那没啥影响, 否则会出问题
C/C++不进行越界检测, 意思是你分配一段10个单元的内存, 你依然可以访问10个单元后的内存, 如果运气好, 10个内存单元后的内存没有被使用, 那没啥影响, 否则会出问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
malloc就是返回一个由你规定大小的指针,你可以用它动态的创建一些数据,用后要用free把指针指向的地址的空间释放(删掉)以节约运行空间。
如
int* p;
p=(int*)malloc(sizeof(int));
*p=55;
printf("%d",*p);
free(p);
另一个calloc()是返回数组指针。
type* p=(strcut type*)calloc(n,size);
如
int* p;
p=(int*)malloc(sizeof(int));
*p=55;
printf("%d",*p);
free(p);
另一个calloc()是返回数组指针。
type* p=(strcut type*)calloc(n,size);
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询