大侠们请帮看看这段代码有什么问题没?
int *D(void)
{
int *i;
i=(int *)malloc(sizeof(int));
*i=1000;
return i;
}
main(void)
{
int *i;
i=D();
printf("%d",*i);
getch();
}
问题:1,malloc 分配的空间会不会随着D函数的终结而被系统回收?
2,上面这段代码是可以正常运行的,是不是i只是指向了那段空间,这段空间是可以被其他函数重新占有的?
3,是不是只有调用了free之后malloc分配的空间才会被系统回收,这样的话,我若不调用FREE函数,是不是
在整个程序运行完后,MALLOC分配的空间也不能被系统回收?
总言之:我就是想知道,MALLOC分配的空间在没有调用FREE之前,它的生命周期到底有多长??
兄弟们一定要帮帮我啊!!!
----------------解决方案--------------------------------------------------------
在没有free之前,这段空间没有被收回,只是在函数结束后,D函数中的i这个指针变量被释放掉了,但已经把申请的地址返回给了main中的i这个变量
----------------解决方案--------------------------------------------------------
lib.h
//定义头文件
#include<stdio.h>
#ifndef _LIB_H_
#define _LIB_H_
#define LEN sizeof(struct student)
#ifndef NULL
#define NULL 0
#endif
enum bool{false,true};
struct student
{
int key;
char name[10];
struct student *s;
};
#endif
oprationg.c
//建立一个空堆栈
#include "lib.h"
struct student *CreatStack(void)
{
struct student *head;
char name[]={"$"};
head=(struct student*)malloc(LEN);
if(!head) return NULL;
head->key=0;
strcpy(head->name,name);
head->s=NULL;
/*free( head );这条语句用或没用结果都是对的,而且编译系统都有一条警告:[Warning] assignment makes pointer from integer without a cast 。而之前我给的那个程序在这个位置没用FREE就是正确的(这是希望的结果),也没有警告;而用了之后就完全是错的(如果按你所说,这也是在预料之中的)。为什么两个类似的程序却有两个不同的表现?*/
return head;
}
main.c
//主函数里调用构造函数,并验证结果
#include "lib.h"
main(void)
{
struct student *head;
head=CreatStack();
if( !head ) puts("Creat Stack Fail");
printf("%d,%s\n",head->key,head->name);
getch();
}
请兄弟帮我参考参考!!!
----------------解决方案--------------------------------------------------------
哪位兄弟帮忙解决上面的问题,谢了!!
----------------解决方案--------------------------------------------------------
我想说在建栈的函数中怎么又要把这个栈毁掉了呢?
head存放的是个地址值,在建站函数调用完成后,会自己自动释放。但是你把head释放之后head也就不会指向这个栈了,刚刚建的栈会不会被回收呢?。
----------------解决方案--------------------------------------------------------
依照我一直的理解同"沉默的羔羊"想法是一样的,如果这种理解没错的话,应该是这样的:FREE(HEAD)之后只是将HEAD指向的那段内存重新还给了操作系统(它再也不会是本程序占有的空间了),而HEAD里面的地址应该没变,但它指向的却是一个危险空间,有可能因为对内存的非法操作而导致本程序的崩溃.
而我的疑问在于:我想在一个程序中分配空间,而在另一个程序中使用这段空间(如果直接用变量来达到这个目的当然是不可以的);我现在用malloc函数来做到这一点,按照我一直的想法是,MALLOC分配的空间在没有调用FREE之前应该是在整个程序运行过程中都存在的(这在谭浩强的教程中也有这样的用法),可实际结果是它有时正确有时不正确,上面第一个程序是正确的,第二个程序是有编译警告的;所以我想问:用MALLOC分配的空间有效期到底有多长??????????????
----------------解决方案--------------------------------------------------------