今天接触了数据结构,终于知道那神秘的数据结构长啥样了!!!嘿....
1】malloc函数
malloc函数申请内存有不成功的可能,那我们在使用指向这块内存的指针时,必须if(NULL!=p)语句来验证内存确实分配成功了。malloc两次只free一次会内存泄漏,malloc一次free两次肯定会出错。内存释放之后最好重新把p=NULL;否则,free(p)之后,
if(NULL!p)这条检测语句将会失效。
2】编程风格:
用缩行显示程序结构,是排版整齐,缩进量统一使用4个字符。
3】错误总结:
今天在写一个顺序表插入操作函数是犯了个经常容易犯的错误,如:
typedef int datatype;
typedef struct
{
datatype data[10];
int last;
}sqlist,*sqlink;
int Createlist(sqlink link)
{
link=(sqlink)malloc(sizeof(sqlist));
if(link==null)
return 0;
else
return 1;
}
int main()
{
sqlink plink;
datatype mdata;
if(Createlist(plink)==1)
printf("success");
else
printf("fail");
......
}
高手一看就知道我犯了个低级错误,我将plink传个形参link,是形参link指向我malloc的一块内存,注意:此时是形参link指向了堆区的一块内存,而plink指向的仍是一片未知的区域。当Createlist函数结束后,栈中的link释放了,从而造成了内存泄漏。
解决方法有两个:
1/首先修改传进的参数为指针的地址----
int Createlist(sqlink *link)
{
*link=(sqlink)malloc(sizeof(sqlist));
if(*link==null)
return 0;
else
return 1;
}
....
if(Createlist(&plink)==1)
....
2/返回一个分配的内存地址:
sqlink Createlist(sqlink link)
{
link=(sqlink)malloc(sizeof(sqlist));
if(link==null)
return link;
else
return NULL;
}
这样问题解决了,岂不痛哉。。。。
4】scanf函数小问题
以前不怎么注意,这函数还真有些小陷阱在里面。
如:
int mdata;
scanf("%d",&mdata);
printf("%d",mdata);
scanf("%d",&mdata);
printf("%d",mdata);
如果第一个scanf输入的参数不是int型,第二个scanf将直接输出...等。。大家可试试。。
分析详见: