C語言中字符數組和字符串指針分析

#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和new區別:

一、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);


在 char day[15] = "abcdefghijklmn"; 這個語句執行的時候,系統就分配了一段長15的內存,並把這段內存起名爲day,裏面的值爲"abcdefghijklmn",以下圖所示:  

&day:day這個變量的內存地址,即a字符的地址;
&day[0]:一樣爲a字符地址;
day:使用變量名來索引變量中的內容,理解爲指針,一樣爲a字符的地址;

關於字符串指針str,在執行char* str = "opqrstuvwxyz"後內存的圖示以下:內存分配了兩段內存,一個名爲str,類型是一個字符指針,另一段是一個字符串常量,且str裏面存放着字符常量的首地址,注意這裏沒法經過str修改這段字符串,由於是常量 spa


 


&str:str這個字符指針的地址
&str[0]:str所指字符常量第一個字符的地址 
str:str這個字符指針的值,即字符串的首地址
相關文章
相關標籤/搜索