c語言傳值操作
c語言中的函式引數傳遞都是傳值操作,所以要使被呼叫函式改變呼叫函式的屬性內容,則需要傳遞所需修改屬性的指標——屬性位址。
例1:
void getmemory(char *p)void test(void)
請問執行test 函式會有什麼樣的結果? 答:
因為getmemory函式接收的是str指標的拷貝,所以,當其退出時,str的拷貝p在棧中的內容會被釋放,並且以上操作對test函式中的str沒有影響, str一直都是null ,strcpy(str, "hello world"); 將使 程式崩潰。
例2:
void getmemory2(char **p, int num)請問執行test 函式會有什麼樣的結果? 答:void test(void)
( 1 )能夠輸出hello;(2 )記憶體洩漏
例3:
char *getmemory(void)請問執行test 函式會有什麼樣的結果?void test(void)
請問執行test 函式會有什麼樣的結果?
答:可能是亂碼。因為getmemory 返回的是指向「棧記憶體」的指標,該指標的位址不是null ,但其原現的內容已經被清除,新內容不可知。
例4:
void test(void)}
答:篡改動態記憶體區的內容,後果難以預料,非常危險。
因為free(str); 之後,str 成為野指標,
if(str != null) 語句不起作用。謹記malloc之後一定記得free,free之後將指標null一下,以免形成野指標。
以下摘自其他地方:
例5:
void getmemory(char **p,int num)int main()
printf("\n str is %s",str); 軟體開發網 www.mscto.com
getchar();
}
問輸出結果是什麼?
答案:輸出str is world。
free 只是釋放的str指向的記憶體空間,它本身的值還是存在的.所以free之後,有乙個好的習慣就是將str=null.此時str指向空間的記憶體已被**,如果輸出語句之前還存在分配空間的操作的話,這段儲存空間是可能被重新分配給其他變數的,儘管這段程式確實是存在大大的問題(上面各位已經說得很清楚了),但是通常會列印出world來。這是因為,程序中的記憶體管理一般不是由作業系統完成的,而是由庫函式自己完成的。當你malloc一塊記憶體的時候,管理庫向作業系統申請一塊空間(可能會比你申請的大一些),然後在這塊空間中記錄一些管理資訊(一般是在你申請的記憶體 前面一點),並將可用記憶體的位址返回。但是釋放記憶體的時候,管理庫通常都不會將記憶體還給作業系統,因此你是可以繼續訪問這塊位址的。
C語言 傳值與傳位址
1 傳值 實參把值傳給了形參,但沒有傳位址即對實參的修改無效。核心原理 函式會對形參和中間的臨時變數 函式內定義的變數 重新分配空間。大多數型別都是傳值,1 全域性變數 把引數定義成全域性變數,一次性分配空間,傳位址,函式訪問時無須引數,直接訪問 2 指標是傳值的,但指標的間接引用是傳位址的 3 陣...
C語言 傳值與傳位址
1 傳值 實參把值傳給了形參,但沒有傳位址即對實參的修改無效。核心原理 函式會對形參和中間的臨時變數 函式內定義的變數 重新分配空間。大多數型別都是傳值,1 全域性變數 把引數定義成全域性變數,一次性分配空間,傳位址,函式訪問時無須引數,直接訪問 2 指標是傳值的,但指標的間接引用是傳位址的 3 陣...
c語言傳遞引數
1.標準資料型別,int char 等。如果c傳遞的是單個資料型別,會在被調函式中重新建立乙個物件。所以,無論我們在被調函式中怎麼修改,主調函式的值不會發生變化。2.陣列。當我們傳遞的引數是乙個陣列時,c傳遞的是陣列首元素的位址。所以當我們在被調函式中做修改了,主調函式的值也會變化。3.自定義資料型...