c/c++ 關於內存的思考(一)

1.

void GetMemory(char *p)
{
	p = (char *)malloc(100);
} 
void Test(void)
{
	char *str = NULL;
	GetMemory(str);  
	strcpy(str, "hello world"); 
	printf(str);
}

請問運行Test函數會有什麼樣的結果?
答:程序崩潰。
因爲GetMemory並不能傳遞動態內存,
Test函數中的 str一直都是 NULL。 strcpy(str, "hello world");將使程序崩潰。

2.

char *GetMemory(void)
{  
	char p[] = "hello world"; 
	return p;
} 
void Test(void)
{
	char *str = NULL;
	str = GetMemory();
	printf(str);
}

請問運行Test函數會有什麼樣的結果?
答:可能是亂碼。
因爲GetMemory返回的是指向“棧內存”的指針,該指針的地址不是 NULL,但其原現的內容已經被 清除,新內容不可知。

3.

void GetMemory2(char **p, int num)
{
	*p = (char *)malloc(num);
} 
void Test(void)
{
	char *str = NULL;
    GetMemory(&str, 100);
    strcpy(str, "hello");
    printf(str);   
}

請問運行Test函數會有什麼樣的結果?
答: (1)能夠輸出hello (2)內存泄漏

4.

void Test(void)
{
	char *str = (char *) malloc(100);
	strcpy(str, "hello");
	free(str);	  
	if(str != NULL)
	{
		strcpy(str, "world");
	    printf(str);
	}           
} 

請問運行Test函數會有什麼樣的結果?
 答:篡改動態內存區的內容,後果難以預料,非常危險。 因爲free(str);之後,str成爲野指針, if(str != NULL)語句不起作用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章