ошибка в двойном значении - PullRequest
0 голосов
/ 30 апреля 2011
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));

}

результат в методе main дает значение дампа, может кто-нибудь помочь мне в этом? выход:

Начальное значение *

Двойная сумма * 1000.123400

Финал ........ 1000.123400

Возврат ---- 1000.123400

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


Ответы [ 5 ]

2 голосов
/ 30 апреля 2011

amount_array_n будучи локальным по отношению к функции, уничтожается после ее возврата. Использование возвращаемого значения вызовет неопределенное поведение.

2 голосов
/ 30 апреля 2011

Вы возвращаете ссылку на локальную переменную, которая является причиной проблемы.

char amount_array_n[25];

amount_arra_n - это массив символов, находящийся в стеке, который становится недействительным при возврате вызова функции.

1 голос
/ 30 апреля 2011

Когда ваша функция возвращается, выделенный ей массив символов освобождается, поэтому, когда вы возвращаете указатель на этот массив, указатель становится недействительным.Возвращать это неопределенное поведение, что означает, что компилятор может делать все что угодно.Если вам действительно не повезло, это сработает, и вы не поймете, что у вас есть проблема, до тех пор, пока годы спустя ваша программа не сломается и вы не будете знать, почему.В большинстве случаев вы получаете значения мусора или сбои.

Если вы хотите, чтобы функция возвращала указатель на массив, вам нужно динамически выделить его или передать буфер (и размер буфера) дляфункция для записи.

1 голос
/ 30 апреля 2011

Вы возвращаете указатель на amount_array_n в конце функции format_double_trans_amount () , однако область действия этого выделенного массива стека ограничена телом функции.Попытка получить доступ к этой области памяти после выхода из функции приведет к неопределенному поведению (в лучшем случае отображаемому мусору, а в худшем случае к аварийному завершению).

Быстрое и грязное исправление в вашей программе добавляет статическое значение amount_array_n:

static char amount_array_n[25];

Это сделало бы массив эффективной глобальной переменной.Тем не менее, это не очень элегантное решение, просто быстрое решение для вашей тестовой программы.

0 голосов
/ 30 апреля 2011

amount_array_n - локальная переменная, когда вы возвращаете ее указатель на основную функцию, у него не будет действительного адреса, поэтому вы получаете этот вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...