双值错误
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
是驻留在其上得到的函数调用的返回无效向上堆叠的字符阵列。
当你的函数返回时,它所分配的字符数组被解除分配,所以当你返回一个指向该数组的指针时,指针将变为无效。返回它是未定义的行为,这意味着编译器可以做任何事情。如果你真的不走运,它会起作用,直到几年后,当你的整个程序中断,你不知道为什么时,你才会意识到你有问题。在大多数情况下,你会得到垃圾值或崩溃。
如果你想让函数返回一个指向数组的指针,你需要动态分配它,或者传递一个缓冲区(和缓冲区的大小)以供函数写入。
但是当我减少数组大小char amount_array_n [25]喜欢amount_array_n [12];它给出了结果? – jcrshankar 2011-04-30 07:08:35
@jcrshankar - 我在上面看到你的评论,并修改了我的答案。 – 2011-04-30 07:09:42
amount_array_n是局部变量,当你将它的指针返回给main函数时,它不会有一个有效的地址,这就是你得到那个输出的原因。
amount_array_n
对函数本地函数返回后会被销毁。使用返回值会调用未定义的行为。
'/指向/'指向/' – 2011-04-30 07:05:54
否i char char_array_n [25];减少像amount_array_n [12]的值;它给出了结果? – jcrshankar 2011-04-30 07:05:59
@jcrshankar - 这是未定义的行为。该标准说它可以做任何事情。代码似乎可以正常工作,但这并不正确。 – 2011-04-30 07:09:10