記憶體操作的一些細節收集

2022-08-19 04:36:11 字數 1778 閱讀 1797

一. 記憶體分配方式有三種:

1. 從靜態儲存區域分配: 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。

2. 在棧上建立: 在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。 這個大小在linux上可以使用:ulimit -a | grep stack 來檢視

3. 從堆上分配: 亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。動態記憶體的生存期由我們決定,使用非常靈活,但問題也最多。

char p_arr = "p_arr : hello world";

//p_arr是個陣列的起始位址,這個陣列的內容是存放在棧上面的。另外,非常值得一

char *p_heap=(char *)malloc(sizeof(char)*20);

//p_heap是乙個指標變數,這個指標變數存在於棧上面,指標變數的值是指向的由

//malloc分配得到的堆上的記憶體空間的起始位址。

char *ptr = "ptr : hello world";

//ptr是乙個指標變數,這個指標變數存在於棧上面,指標變數的值是指向的後面字元

//串的起始位址,這個字串是常量,是存在於靜態儲存區域的,不是在棧上,也不是在堆上。

二. 向函式傳引數時,一般而言,傳入非const的指標時,就表示,在函式中要修改這個指標把指記憶體中的資料。如果是傳值,那麼無論在函式內部怎麼修改這個值,也影響不到傳過來的值,因為傳值是只記憶體拷貝。如下:

void getversion(char* pstr)

main()

//程式中妄圖通過函式getversion給指標ver分配空間,但這種方法根本沒有什麼作用,

//原因就是——這是傳值,不是傳指標。

三. strcat, strcpy

extern char* strcat(char *dest,char *src);

//把src所指字串新增到dest結尾處(覆蓋dest結尾處的'\0')並新增'\0'。

//src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字串。

//返回指向dest的指標。

char s1[128] = "hello, "; //error: char* s1 = "hello, ";

char* s2 = "world!";

char* s3 = strcat(s1, s2);

extern char* strcpy(char *dest,const char *src);

//標頭檔案:string.h

//說明:src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字串,返回指向dest的指標。

//p 沒有分配空間

char *p;

strcpy(p, "abc");

//沒有崩潰,說明運氣好p所指向的隨機位址對你來說是可寫的。

char a = "hello";

int len = strlen(a);

char* p = (char*)malloc(sizeof(char)*(len + 1));

strcpy(p, a);

int num = sizeof(a);//等於6,(別忘了還有'\0')

vim一些操作細節

vim的配置 add by me set dictionary usr share dict words set isk ctrl x k 能自動提示補全單詞 增加語言支援ruby,html,css,php 等 if has autocmd filetype plugin indent on end...

C 的一些細節

1.c 中,將負數賦值給unsigned是完全合法的。例如,將 1賦值給unsigned char,那麼結果是255.2.c 中,double的精度和計算速度都要超過float,long double則需要承擔額外的執行代價。3.std ou t hi d endl 等價於std out hi 4....

迴圈的一些細節

1 迴圈執行次數相同,大迴圈放在外面還是小迴圈放在外層效率高呢?int end1 10 int end2 100 int end3 1000000 long starttime system.nanotime 開始時間 for int i 1 i end3 i long endtime system...