今天接觸了數據結構,終於知道那神祕的數據結構長啥樣了!!!嘿....
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將直接輸出...等。。大家可試試。。
分析詳見: