#include<iostream> #include<string> #include<vector> using namespace std; char* getMe1() { char c[]="world1"; return c; }//無效指針,輸出不肯定,c是函數getMe1中申請的一個臨時變量,函數調用完後,其空間已經不存在。
char* getMe2() { char* b= "hello"; return b; }//雖然getMe2運行雖然不會出錯,可是函數設計錯誤,由於「hello」是常量字符串,位於靜態存儲區,在程序生命運行期間內恆定不變,不管何時調用getMe2,它總返回一個「只讀」內存塊。
void getMe3(char **p,int num) { *p = (char*)malloc(num); }//函數getMe3中的p參數是指向指針的指針,若是是一級指針則會出現錯誤,不會申請到地址。
void getMe4(char *p,int num) { *p = (char*)malloc(num); }//運行錯誤,會致使內存泄露
void getMe5(int num) { char *p = (char*)malloc(sizeof(char*)*num); return p; }//返回動態申請的內存,只要不釋放內存,即調用free,就可使用該段內存。
int main() { char *str1,*str2; str1 =getMe1(); str2 =getMe2(); char *str3=NULL; getMe3(&str3,100); char *str4=NULL; getMe4(str4,100); char *str5=NULL; str5=getMe5(100); strcpy(str5, "hello"); free(str5); return 1; }
一、malloc是libc中一個函數,須要include stdlib.h,不然gcc會報錯;而new是C++關鍵字,不依賴於頭文件; ios
二、new能夠返回指定類型的指針,並能夠自動計算所需大小。malloc則必須由咱們計算字節數,並在返回時強行轉換爲實際類型的指針。 shell
字符數組和字符串指針的區別: 數組
原型:extern void *malloc(unsigned int num_bytes);void free(void *ptr); 函數
int *pn = new int;//返回int*類型,分配大小爲sizeof(int);使用delete pn; int *pnarr = new int[100];//返回int*類型,分配大小爲sizeof(int)*100;使用delete []pnaar; int *pm = (int*)malloc(sizeof(int)*100);//分配100個整型存儲單元,或100*4字節;使用 free(pm);
&day:day這個變量的內存地址,即a字符的地址; &day[0]:一樣爲a字符地址; day:使用變量名來索引變量中的內容,理解爲指針,一樣爲a字符的地址;
關於字符串指針str,在執行char* str = "opqrstuvwxyz"後內存的圖示以下:內存分配了兩段內存,一個名爲str,類型是一個字符指針,另一段是一個字符串常量,且str裏面存放着字符常量的首地址,注意這裏沒法經過str修改這段字符串,由於是常量。 spa
&str:str這個字符指針的地址 &str[0]:str所指字符常量第一個字符的地址 str:str這個字符指針的值,即字符串的首地址