函數的參數傳遞

首先要明白函數體是一個作用域,函數的形參爲函數提供了已命名的局部存儲空間。形參是在函數的形參表中定義的,由調用函數時傳遞給函數的實參初始化。每次調用函數時,都會重新創建該函數所有的形參,此時所傳遞的實參將會初始化對應的參數。形參的初始化與變量的初始化一樣:如果形參具有非引用類型,則複製實參的值;如果形參爲引用類型,則它是實參的別名。

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

void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str,”helloworld”);
printf(str);
}
請問運行Test函數會有什麼樣的結果?
答:程序崩潰。因爲在調用GetMemory的時候,用實參str的拷貝來初始化形參p,函數體中只是改變了p(str的拷貝)的值,並沒有改變str的值。實際上str此時仍爲一個無效的指針。

char *GetMemory(void)
{
char p[]=”helloworld”;
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
請問運行Test函數會有什麼樣的結果?
答:可能是亂碼。因爲GetMemory返回的是指向“棧內存”的指針,該指針的地址不是NULL,但其原先的內容已經被清除,新內容不可知。

當函數執行完時,就會釋放分配給局部對象的存儲空間(棧內存)。此時,對局部對象的引用和指針就會指向不確定的內存。

void GetMemory(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,因爲在調用GetMemory的時候,用實參str的拷貝來初始化形參p,函數體改變了str拷貝所指向的內存的值(2)內存泄漏


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