有關於指針和取地址符的使用

#include<iostream>

using namespace std;

void GetMemory(char *&p)
{
	p=(char*)malloc(100);
}

void Test(void){
	char *str=NULL;
	GetMemory(str);
	strcpy(str,"hello world");
	printf("%s",str);
}
void main()
{
	Test();
}

這個時候會遇到什麼問題?一定不是編譯出錯,一定會是運行出錯!

//這是原來的函數,使用的是值傳遞方式
void GetMemory(char *p){ p=(char *)malloc(100); } 
//這是正確的內存分配函數,使用的是雙重指針,傳遞進來的是str的指針地址,*p就是原來的str
void GetMemory2(char **p) { *p=(char*)malloc(100); }
//這是使用引用的內存分配函數
void GetMemory3(char* &p) { p=(char*)malloc(100); }
void Test(void){ 
char *str=NULL; 
GetMemory(str); // 該函數做的工作是 p=str, p=malloc(100); 和str一點關係都沒有,str=NULL;
//GetMemory2(&str); //該函數做的工作是 char**p=&str, str=*p=malloc(100),內存分配成功
//GetMemory3(str); // 傳遞的是str的引用,函數內的 p還是str,分配成功
strcpy(str, "Hello World!"); //現在可以 知道,第一個函數分配內存錯誤,strcpy也會失敗
printf("%s\n", str); //輸出只能是空
}

發佈了21 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章