对c语言中malloc函数的不解

#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的功能只是开了一个首地址,后面超的全部自动放在连续地址上么?

malloc函数主要是用于功态申请内存。对于一些程序有可能会临时使用一些内存,用过后就不再需要了。虽然可以定义一个数组来实现,但如果需要的数量较大,且数量不固定,定义数组的方法会造成内存空间浪费。而用malloc可以实现动态申请内存,使用完后可以释放,能提高内存的利用率。当然如果是要始终保持数据的话,用数组会更方便。
用malloc函数申请内存是要指出数量的。且在使用时,不应超过申请的数量。如果对超过申请数量的内存单进行操作(特别是写入操作),是有可能因内存泄露而影响系统正常动行。
温馨提示:内容为网友见解,仅供参考
第1个回答  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,你运气好,不然崩溃是没得商量的。

第2个回答  2019-03-15
malloc就是用来进行动态分配的,由程序员自己分配内存,正常情况下一般变量是由系统自动分配到栈内存中的,而malloc也是动态在堆中分配
第3个回答  2019-03-14
malloc分配一段连续的内存
C/C++不进行越界检测, 意思是你分配一段10个单元的内存, 你依然可以访问10个单元后的内存, 如果运气好, 10个内存单元后的内存没有被使用, 那没啥影响, 否则会出问题
第4个回答  2019-03-17
malloc就是返回一个由你规定大小的指针,你可以用它动态的创建一些数据,用后要用free把指针指向的地址的空间释放(删掉)以节约运行空间。

int* p;
p=(int*)malloc(sizeof(int));
*p=55;
printf("%d",*p);
free(p);
另一个calloc()是返回数组指针。
type* p=(strcut type*)calloc(n,size);本回答被提问者采纳

c语言,malloc()函数的问题
一、malloc()不会初始化所分配的空间。(即,你申请的空间中,其内容是不确定的,可能有值,也可能没值)二、当free()释放所申请的空间时,空间中的内容也不会被自动清除。三、不断的malloc, free的过程中,内存中就会产生一系列的内存碎片,整个内存就象一个大的垃圾场。再次申请内存时,新划分的...

求问个c语言中 malloc函数的问题。malloc既然是动态分配,可它在分配的...
Malloc在程序运行时向操作系统申请并分配一块连续的内存空间(内存块),所在位置是在堆内存上,程序运行时向操作系统申请分配内存,内存地址由操作系统决定,叫做动态分配;编译时分配或安排内存空间叫静态分配,静态分配的内存空间一般在栈上,相对于程序进程空间,由编译器决定,这是两个主要区别。堆和栈的...

C语言realloc函数经常不能理解的出错
C语言 realloc() 函数位于 stdlib.h 头文件中,其原型为:void *realloc(void *ptr, size_t size);realloc() 会将 ptr 所指向的内存块的大小修改为 size,并将新的内存指针返回。在你的代码里a、b始终指向同样大小的内存块 相必也并不是你的初衷 ...

c语言,malloc()和calloc()的区别问题
这两个函数其实顶多就是按照不同人的习惯设置的。还有就是malloc开辟的空间都没有初始值 而calloc开辟的空间初始值全部为0

[c语言]关于malloc函数的基础使用问题。万分感谢!
q两个节点。第二题先r->next = q;的话,最后面的一句q->next = r->next相当于q->next = q;后面的节点就都丢了。理 解链表操作要把握好实际内存存储的东西是不变的,变得是操作他们的指针。要时刻把握指针指向哪里,比如最开始p->next = q; q->next = r;还有不明白的请追问。

C学习:内存分配之malloc函数和alloca函数辨析
C语言内存管理中,malloc函数与alloca函数犹如两把不同的钥匙,它们在动态内存分配上各有千秋。本文将深入解析它们的异同点,并提供一些实用信息供进一步探索。首先,它们的共同点在于动态性和灵活性。malloc和alloca都允许根据程序运行时的需求动态地分配内存,它们的返回类型相同,都是返回指向分配内存的起始...

malloc背后的调用机制-malloc内存分配过程详解
在编程中,malloc函数是每位C\/C++开发者熟悉的内存分配工具。尽管我们日常使用它分配和释放内存,但对其背后的具体调用机制可能并不完全了解。malloc其实不仅仅是库中一个简单的函数,它体现了C语言库的复杂性。让我们深入探讨其工作原理。首先,理解malloc的定义至关重要。标准C定义中,malloc函数的基本形式...

C语言 malloc()函数 分配内存空间尺寸的问题
malloc是给指针变量分配内存空间的函数命令 正确使用:分配的空间要能保证容下你想存储的数据,不要和机器逗着玩(分配0空间,或少于自己实际需要的空间),如你上面的操作,表面上你程序运行没有问题,可实际上你占用了别人的地盘,只是当前你很幸运没有使程序出现问题,但不保证一定不出问题!!不再...

函数中用malloc开辟空间的问题(C语言)
按你说的,没有把指针返回也没有释放,那么函数返回时开辟的空间还在,但你已无法引用。用malloc是在堆中分配的空间,用完需用自已显示释放.采用如int a=0的方式会在栈中分配空间,函数返回时栈指针回移,此空间仍能被其它函数使用(相当于自动释放)...

c语言中使用free函数出现越界问题该怎么解决呢???
因为分配内存分配少了,导致后面使用越界,因此释放内存时出问题,分配内存的语句应该这样:mtrx=(int *)malloc((max+max)*sizeof(int));按你原来的方式只分配了1\/4的内存。

相似回答