一. 記憶體分配方式有三種:
1. 從靜態儲存區域分配: 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。
2. 在棧上建立: 在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。 這個大小在linux上可以使用:ulimit -a | grep stack 來檢視
3. 從堆上分配: 亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。動態記憶體的生存期由我們決定,使用非常靈活,但問題也最多。
char p_arr = "p_arr : hello world";二. 向函式傳引數時,一般而言,傳入非const的指標時,就表示,在函式中要修改這個指標把指記憶體中的資料。如果是傳值,那麼無論在函式內部怎麼修改這個值,也影響不到傳過來的值,因為傳值是只記憶體拷貝。如下://p_arr是個陣列的起始位址,這個陣列的內容是存放在棧上面的。另外,非常值得一
char *p_heap=(char *)malloc(sizeof(char)*20);
//p_heap是乙個指標變數,這個指標變數存在於棧上面,指標變數的值是指向的由
//malloc分配得到的堆上的記憶體空間的起始位址。
char *ptr = "ptr : hello world";
//ptr是乙個指標變數,這個指標變數存在於棧上面,指標變數的值是指向的後面字元
//串的起始位址,這個字串是常量,是存在於靜態儲存區域的,不是在棧上,也不是在堆上。
void getversion(char* pstr)三. strcat, strcpymain()
//程式中妄圖通過函式getversion給指標ver分配空間,但這種方法根本沒有什麼作用,
//原因就是——這是傳值,不是傳指標。
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...