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:/ò#($$Ð/Òð
答案 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函数时,它将没有一个有效的地址,这就是你获得该输出的原因。