双值错误

时间:2011-04-30 07:01:09

标签: c

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


5 个答案:

答案 0 :(得分:2)

您将返回导致问题的局部变量的引用。

char amount_array_n[25];

amount_arra_n是驻留在堆栈上的字符数组,在返回函数调用时会失效。

答案 1 :(得分:2)

在函数返回后,函数本地的

amount_array_n被销毁。使用返回的值将调用Undefined Behavior。

答案 2 :(得分:1)

您正在函数 format_double_trans_amount()的末尾返回指向 amount_array_n 的指针,但是该堆栈分配数组的范围仅限于函数体。在退出函数后尝试访问该内存区域将导致未定义的行为(最好显示垃圾,最坏的情况是崩溃)。

对程序的快速和脏修复是向amount_array_n添加静态:

static char amount_array_n[25];

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

答案 3 :(得分:1)

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

如果希望函数返回指向数组的指针,则需要动态分配它,或传入缓冲区(以及缓冲区的大小)以便写入函数。

答案 4 :(得分:0)

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