C语言动态开辟内存问题1
发布网友
发布时间:2023-10-25 11:30
我来回答
共3个回答
热心网友
时间:2024-11-16 03:34
根据使用函数不同,作用各不相同。共同点均是动态分配一段内存,使用后需要用free函数释放。所有动态分配函数均声明在stdlib.h中。
1 malloc
void *malloc(unsigned int num_bytes);
功能
分配长度为num_bytes字节的内存块
返回值
如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。
说明
关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。
2 calloc
void *calloc(size_t n, size_t size);
在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。
calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。
3 realloc
void *realloc(void *mem_address, unsigned int newsize);
功能
先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。
返回值
如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
注意
当内存不再使用时,应使用free()函数将内存块释放。
热心网友
时间:2024-11-16 03:34
k1=k2=(struct Student *) malloc (sizeof(struct Student)); //第一次输入
memset(k1,0,sizeof());
里面有没有字符数组的东西??先初始化一下吧.
别到时候你赋的时候有个东西没赋值,也没初始化,越界了.
另外,你的代码没贴全啊.这程序,你看起来是在fwrite的时候出的问题,但是,出问题的时候有可能是在你之前的一些操作导致的,就比如,输一个学生的名字,char name[15],但你名字输了20个,越界了,之类的,所以,建议把全代码贴下.
热心网友
时间:2024-11-16 03:35
粘全了吧.