双值错误

问题描述:

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:/ò#($$Ð/Òð


您在函数format_double_trans_amount()的端amount_array_n返回指针到,然而该堆栈分配的数组的范围仅限于该功能的身体。试图在退出该函数后访问该内存区域将导致未定义的行为(最多显示垃圾,最坏的是崩溃)。

的快速和肮脏的修复你的程序添加静态到amount_array_n:

static char amount_array_n[25]; 

这将使阵列有效的全局变量。不过,这不是一个非常优雅的解决方案,只是针对您的测试程序的快速修复。

您正在返回引起问题的局部变量的引用。

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

当你的函数返回时,它所分配的字符数组被解除分配,所以当你返回一个指向该数组的指针时,指针将变为无效。返回它是未定义的行为,这意味着编译器可以做任何事情。如果你真的不走运,它会起作用,直到几年后,当你的整个程序中断,你不知道为什么时,你才会意识到你有问题。在大多数情况下,你会得到垃圾值或崩溃。

如果你想让函数返回一个指向数组的指针,你需要动态分配它,或者传递一个缓冲区(和缓冲区的大小)以供函数写入。

+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

amount_array_n是局部变量,当你将它的指针返回给main函数时,它不会有一个有效的地址,这就是你得到那个输出的原因。

amount_array_n对函数本地函数返回后会被销毁。使用返回值会调用未定义的行为。