2016-09-19 44 views
0

看看這個代碼變量值變髒:C:在返回到調用函數

extern void f3(int); 

void f2 (int foo) { 
    //some stuff 
    f3(foo) 
    printf("f2:%d\n",foo); 
} 
void f1 (int foo) { 
     //some stuff 
     f2(foo); 
     printf("f1:%d\n",foo); 
} 

int main() { 
     //some stuff 
     f1(foo) 
     //other stuff 
     return 0; 
} 

我的問題是,我有這樣的輸出:

f2: 1060 //this is the correct value 
f1: 1065294485 

還有就是之間無碼在函數f2中打印和函數結束。函數f2的調用和函數f1中的打印之間沒有代碼。這種價值變化有多可能? 我需要在堆棧中分配大數據結構,並使用ulimit -s 2^28。我還使用gcc -mO0 -m32 -msse進行編譯,因爲函數f3是使用sse寫入nasm。問題依賴於這個嗎? 向我諮詢其他可能有助於理解問題的內容。

編輯:我示出了真實的F2()函數:

void upgma_start(float* centroids,int k,int c,int d,float* size,float *md) { 
    float mc1 [d]; 
    float mc2 [d]; 
    upgma(centroids,k,c,d,size,md,mc1,mc2); 
    printf("uuu:::%d:\n",k); 
} 

功能UPGMA是示例代碼的函數f3,k爲FOO變種

+0

f3的功能非常強大嗎?你可以用虛擬函數替換它,並檢查結果是什麼? – maja

+0

這裏最重要的是你把東西放在哪裏//其他的東西 –

+6

我不能再現你所得到的東西。我們需要一個[最小化,完整和可驗證的示例](http://stackoverflow.com/help/mcve) – Riley

回答

3

我需要分配大數據結構棧

爲什麼?爲什麼你不能簡單地使用malloc/free?

問題依賴於此?

可能在你f2內存訪問越界,達到成的f1棧幀。這與你的堆棧大小沒有直接關係,但是你可能有一個超出邊界的數組訪問,並且索引太大,而不是寫入f2的堆棧幀中的數組,因此你在f1中搗毀了某些東西。

如果您使用了動態內存,則此問題可能會表現爲段錯誤。我強烈建議你切換到動態內存,並使用像Valgrind這樣的內存調試器來追蹤代碼中的違規指令。

+0

我在開始時使用了malloc和free,但是如果我像創建一個函數myFunc()那樣分配,使用和刪除數據structeres並在一個循環中調用這個函數(double free error和類似的東西) 。 – user3415993

+1

分配/使用/銷燬的函數由於循環而不會因爲錯誤而產生雙倍空閒錯誤。 – Zastai

+0

@datenwolf:我對某些結構使用了malloc/free,現在它似乎正常工作。謝謝。 – user3415993