乙個由c/c++編譯的程式占用的記憶體分為以下幾個部分1. malloc()棧區(stack)― 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。
堆區(heap) ― 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os** 。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶。
全域性區(靜態區)(static)―,全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程式結束後有系統釋放
文字常量區 ―常量字串就是放在這裡的。 程式結束後由系統釋放
程式**區―存放函式體的二進位制**。
的空間必須用
free()
函式進行釋放,否則會發生記憶體洩露 如:
fun()
fun()問:
是不是第2種方式開闢的空間在函式結束後如果不free 這個空間不釋放? 第1種方式在函式結束後會釋放空間?
答:
第二種是在堆上分配的空間,在函式結束後不會釋放,需要手動free,程式結束時也會釋放.2. 用來接收內部函式返回的字串,字串長度較確定的可以直接使用字元陣列,陣列的長度最好用定義的巨集,方便以後的修改和維護。第一種是在棧上分配的,函式結束會自動**資源
如:tchar *lpwszstr=null; //pointer to a buffer that receives the translated string
tchar lpwszstr[cmd_line_len]=;/ /pointer to a buffer that receives the translatedstring
3. 被調函式中申請的區域性變數、陣列的空間在被調函式返回結束時會被釋放掉,用呼叫函式的傳進來的指標去指向這段空間是錯誤的。
如:intsdk_get_online_mac(char* ip_online,char*ipmi_user,char* ipmi_pass,char **online_mac)
char *szbuffer[10];//a buffer that receives the return string
for(i=0;i<10;i++)
szbuffer[i]=(char*)malloc(szbuffer_length);
if (null == szbuffer[i])
//(應考慮到本次申請失敗,把本次之前申請的空間釋放掉)
returnipmi_sdk_malloc_err;
memset(szbuffer[i],0,szbuffer_length);
*online_mac=szbuff[i];//(可以,
malloc
的空間一直都在,除非手動釋放或程式)結束)
char szbuffer[pipe_str_frequency][pipe_str_len]=;//a buffer receives thereturn string
*online_mac=szbuff[i];//(不可以,陣列空間在棧區,函式結束會釋放空間,會使*online_mac指向非法空間,解決辦法如下:
intsdk_get_online_mac(char* ip_online,char*ipmi_user,char* ipmi_pass,char *online_mac)
char szbuffer[pipe_str_frequency][pipe_str_len]=;//a buffer receives thereturn string
memcpy(online_mac, zbuffer [3],ipmi_str_len);//把字串拷貝到
online_mac
指向的空間
總結:傳參型別char **buf,
一般用於需在被調函式中申請空間的函式。
4. 定義的變數、指標、陣列等要進行初始化。
5. 要考慮到程式可能執行錯誤的情況,返回規範的錯誤碼。
6. 為方便程式的除錯,應加上一些規範的列印資訊
如:printf("%s, line:%d,matchfail!\n", __function__, __line__);//加上函式名、行號等
__function__、__line__:c編譯器提供的預定義巨集。
7. **要及時的測試其正確性、實用性。
8. 主動讓別人檢查自己**的規範性,有無錯誤、漏洞。
9. c的應用,注意字串操作函式的應用
如:strcpy();拷貝時注意拷貝的字串長度最大為空間長度-1,為『\0』,留出空間
typedef int(*fun_sdk_getautheddevicelist)(char* ipmiuser, char* ipmipass,
char*startip, char* endip, char* mask, datalist** res);//定義函式指標型別
intsdk_getautheddevicelist_stub(char*ipmiuser, char* ipmipass,
char*start_ip, char* end_ip, char* mask, datalist** res, int* result)
fun_sdk_getautheddevicelistfun = null;//用定義的函式型別,定義函式指標變數
char*funname = ipmi_sdk_fun_name_authed_dev_list;
fun= (fun_sdk_getautheddevicelist)getprocaddress(ipmi.hsdkdll, funname);
if(null != fun)
*result= fun(ipmiuser, ipmipass, start_ip, end_ip, mask, res);
returnipmi_srv_ok;
else
dbg("%s_stub(0x%x):sdk(%s) is null", funname, ipmi_srv_get_sdk_function_err, funname);
returnipmi_srv_get_sdk_function_err;
MySQL經驗教訓
mysql語句如下 select buyer id from baoxian.bc insurance order where id in 100000422,100000418,100000417,100000416,100000415,100000413,100000411,100000410,...
CSS 經驗教訓 IE HACKs
1 在ie下最外層邊框無顏色。table td,table th 解決辦法 對table本身也要設定顏色 table,table td,table th 2 字型顯示不正常。h5 在ie中對中文將使用arial 找不到,所以用宋體 其他瀏覽器中文使用 微軟雅黑 英文使用arail 解決辦法 h5 3...
程式設計經驗教訓總結
1 新建的專案工程,其路徑最好不要有中文,避免編譯出錯 2 對於有多個標頭檔案的專案,每個標頭檔案最好使用 ifndef define.endif 以避免重複定義出錯 3 新建結構體 類時一定要記得在結尾處加上封號,不然會報錯 4 對於乙個能正常執行的專案,如果要對其加以修改,最好在動工之前拷貝乙份...