請問malloc在子函式f裡面的問題?請問malloc在子函式修改值為什麼不能體現在主函式裡?

時間 2021-09-16 07:37:43

1樓:Alinshans

兩個問題。

首先,你還不理解什麼叫形參,什麼叫實參。上課都講過swap吧。

void swap(int a, int b)

這樣直接交換兩個 int 是沒有效果的。原因你明白了。但很多人就誤(霧)以為:哦,用指標就可以交換變數了。錯了。看下面這個例子:

void

swap

(int*a

,int*b

)int

main

()p1, p2 的值交換了嗎?你可以試一試,並沒有。原因跟上面那種是一樣的。因為它們本質是都是:

void swap(T a, T b)

的形式,對 a b 的修改,都是對副本的修改。

要怎麼做才可以呢?得把 swap 改成這樣:

void swap(int** a, int** b)

然後把函式呼叫改成

swap(&p1, &p2);

這樣就可以交換 p1 p2 了。

這就是為什麼原來 a 的首位址跟函式裡的 a 的位址不同的原因。這是第一。

然後你可以照模作樣的 f 改成這樣:

void f(int **a, int n)

但是你不能把呼叫寫成

f(&a, 5);

這樣,因為 &a 是乙個 int * 型別,跟 int** 就是不一樣,只是陣列可以退化成指標。所以你就要用乙個中間變數:

int a[5] = ;

int* pa = a;

f(&pa, 5);

然後你很欣慰的看到,還是不能改變 a[0] 的值,為什麼呢?

這是第二個問題,指標確實可以改變指向的內容,但是指標本身也是可以變的啊,你改變了指標的指向,還想去改變原來的指向的內容嗎?很簡單的道理:

int i1 = 0, i2 = 1;

int* p = &i1;

p = &i2;

*p = 2;

printf("%d %d\n", i1, i2);

這裡的輸出是 0 2 而不是 2 1。不做過多解釋了。你的程式也是同理。

你輸出 pa[0] 會發現確實是 5,但這個 pa[0] 的位址跟 a[0] 已經不是同乙個了。因為你在 f 裡呼叫 malloc 把 pa 的指向給改了(逃

所以不知道出於什麼原因你要在 f 裡 malloc 一下。

所以問題其實很好解決的。要麼你可以這樣:

void f(int **a, int n)

int main(void)

; printf("a: %x\n", a);

int* pa = a;

printf("pa: %x\n", pa);

f(&pa, 5);

printf("a[0] after f: %x\n", &a[0]);

printf("%d", a[0]);

return 0;

}int* f(int n)

int main(void)

2樓:蕭瑟

複製貼上

malloc 只管分配記憶體,並不能對所得的記憶體進行初始化,所以得到的一片新記憶體中,其值將是隨機的。

malloc()函式其實就在記憶體中找一片指定大小的空間,然後將這個空間的首位址範圍給乙個指標變數,這裡的指標變數可以是乙個單獨的指標,也可以是乙個陣列的首位址,這要看malloc()函式中引數size的具體內容。我們這裡malloc分配的記憶體空間在邏輯上連續的,而在物理上可以連續也可以不連續。對於我們程式設計師來說,我們關注的是邏輯上的連續,因為作業系統會幫我們安排記憶體分配,所以我們使用起來就可以當做是連續的。

是否有辦法在malloc的hook函式中呼叫原生malloc?

Detours不能做非stdcall的函式hook,所以題主就放棄熱補丁的方式吧,可以採用IAT hook,但是這也要求目標程式是採用動態鏈結CRT執行時庫編譯的,因為靜態鏈結的是不用把malloc函式的位址放在匯入表的。當然啦,題主如果是要自己寫工具來分析堆記憶體的使用情況,並且是只針對windo...

如何證明若函式f在 a,b 上可積,則f在 a,b 上必定有界?

聰明人 為什麼矛盾呢?是因為通過絕對值不等式,推出了黎曼和的絕對值大於任意的正數M,就是說黎曼和的極限不存在,而又因為不定積分的值就是黎曼和的極限,所以說不定積分不存在,即不可積 書上的證明已經寫的很清楚了,別人的解答也點出關鍵點了。我從大思路上給你解釋一下。用的是黎曼可積的定義,即分割 近似 求和...

為什麼國產數分教材在定義函式f在x處極限的時候都要求函式f在x的去心鄰域內有定義?

已登出 我回答的精煉一點。如果x 0可以被取到,那麼有時我們通常認為函式在x 0存在極限的情況將被打破。理由是,x n rightarrow x 0的過程中,可以有無數多個x 0,這樣的話,一旦f x 0 neq lim f x 則f x 在x 0點的極限將不存在。所以教材要求x n序列不取x 0是...