2011-04-30 65 views
0
char *format_double_trans_amount(double amount) 

{ 

    char amount_array_n[25]; 

    strcpy(amount_array_n,""); 

    printf("\nInitial value ***** %s",amount_array_n); 

    printf("\nDouble amount ***** %f",amount); 

    sprintf(amount_array_n,"%1f",amount); 

    printf("\nFinal ........ %s", amount_array_n); 

    printf("\nReturn ---- %s",amount_array_n); 

    return amount_array_n; 
} 

int main() 
{ 

printf ("\nformat_format_double_trans_amount: %s ************", format_double_trans_amount(1000.123400)); 

} 

主要方法的結果給出了轉儲值有人可以幫我一下嗎? 輸出:雙值錯誤

初始值*

雙人量* 1000.123400

最終........ 1000.123400

返回---- 1000.123400

format_format_double_trans_amount:/ò#($$Ð/Òð


回答

1

您在函數format_double_trans_amount()的端amount_array_n返回指針到,然而該堆棧分配的數組的範圍僅限於該功能的身體。試圖在退出該函數後訪問該內存區域將導致未定義的行爲(最多顯示垃圾,最壞的是崩潰)。

的快速和骯髒的修復你的程序添加靜態到amount_array_n:

static char amount_array_n[25]; 

這將使陣列有效的全局變量。不過,這不是一個非常優雅的解決方案,只是針對您的測試程序的快速修復。

2

您正在返回引起問題的局部變量的引用。

char amount_array_n[25]; 

amount_arra_n是駐留在其上得到的函數調用的返回無效向上堆疊的字符陣列。

+0

'/指向/'指向/' – 2011-04-30 07:05:54

+0

否i char char_array_n [25];減少像amount_array_n [12]的值;它給出了結果? – jcrshankar 2011-04-30 07:05:59

+0

@jcrshankar - 這是未定義的行爲。該標準說它可以做任何事情。代碼似乎可以正常工作,但這並不正確。 – 2011-04-30 07:09:10

1

當你的函數返回時,它所分配的字符數組被解除分配,所以當你返回一個指向該數組的指針時,指針將變爲無效。返回它是未定義的行爲,這意味着編譯器可以做任何事情。如果你真的不走運,它會起作用,直到幾年後,當你的整個程序中斷,你不知道爲什麼時,你纔會意識到你有問題。在大多數情況下,你會得到垃圾值或崩潰。

如果你想讓函數返回一個指向數組的指針,你需要動態分配它,或者傳遞一個緩衝區(和緩衝區的大小)以供函數寫入。

+0

但是當我減少數組大小ch​​ar amount_array_n [25]喜歡amount_array_n [12];它給出了結果? – jcrshankar 2011-04-30 07:08:35

+0

@jcrshankar - 我在上面看到你的評論,並修改了我的答案。 – 2011-04-30 07:09:42

0

amount_array_n是局部變量,當你將它的指針返回給main函數時,它不會有一個有效的地址,這就是你得到那個輸出的原因。

2

amount_array_n對函數本地函數返回後會被銷燬。使用返回值會調用未定義的行爲。