2016-11-04 4 views
-1

Поэтому я использую следующий код, в котором функция вызывает выглядит следующим образом (обратите внимание на строку буквальную):Malloc изменение значения другого переменного (символ *)

rmv_zeros("288230376151711744000000", '0', '-'); 

Вот код:

char* rmv_zeros(char *result, char base_0, char minus) 
{ 
     char* formatted; 

     formatted = malloc(sizeof(char) * (strlen(result) + 1)); 
     if (result[0] == base_0 || (result[1] == base_0 && result[0] == minus)) 
     { 
      if (if_rmv_zeros_needed(result, formatted, base_0, minus) == char_to_str(base_0)) 
      { 
       return char_to_str(base_0); 
      } 
      else 
      { 
       return if_rmv_zeros_needed(result, formatted, base_0, minus); 
      } 
     } 
     else 
     { 
      return result; 
     } 
     return formatted; 
} 

Код не войдет в первый оператор if, следовательно, он войдет в else (я увидел, что отладка wile).

Но оно вернет 2882303761517117440000001, добавив '1' в самом конце результата.

Однако, когда я комментирую строку malloc() (пятая строка в этом примере), возвращаемое значение равно 288230376151711744000000, что является значением input'd и логическим возвратом.

Любая помощь по этому вопросу?

Спасибо,

EDIT: Ввод printf("%s\n", result) на 3-й линии и в 19 на самом деле «» исправлениями «» (не цитаты, я знаю, что это не реальное исправление) проблема. Зачем?

+0

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

+0

Вы должны изменить порядок проверок в 'result [1] == base_0 && result [0] == минус'. В настоящее время у вас есть доступ с ограниченным доступом для 'rmv_zeros (" ", '0', '-')' –

+0

Sourav Ghosh: Объясните свою точку зрения. Если я спрошу, что это ясно, потому что я ничего не понимаю, и вы не помогаете. iharob: У меня есть функция проверки, но я решил заменить ее на malloc, поэтому мне легче понять код. Werner: Благодарим за это, реализуя его сейчас. – Greg01re

ответ

1

Существует только одна причина такого поведения: Undefined Behavior

Одной из главных причин может быть утечка памяти у вас есть с malloc в вашу функцию. Выделенная память не является free d, если возвращенная память не возвращается функцией, другими словами, если достигнут return result, как в вашем тестовом примере.

Так что, в первую очередь, это необходимо, иначе, после некоторого времени исполнения, malloc может потерпеть неудачу.

Если все части вашего кода не заботиться о malloc возвращаемого значения, как показано в коде, указатель, переданный результат может быть недействительным (другими словами == NULL)

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

char* rmv_zeros(char *result, char base_0, char minus) 
{ 
     char* formatted = NULL; 

     if (result[0] == base_0 || (result[1] == base_0 && result[0] == minus)) 
     { 
      formatted = malloc(sizeof(char) * (strlen(result) + 1)); 
      if (formatted != NULL) 
      { 
      if (if_rmv_zeros_needed(result, formatted, base_0, minus) == char_to_str(base_0)) 
       { 
        return char_to_str(base_0); 
       } 
       else 
       { 
        return if_rmv_zeros_needed(result, formatted, base_0, minus); 
       } 
      } 
     } 
     else 
     { 
     return result; 
     } 
     return formatted; 
} 

Посмотрите на весь ваш код, чтобы поймать другие подобные проблемы.

+0

@ Downvoter: любые подсказки? – LPs

+0

Это сработало. Спасибо друг. И я также удалил 'return formatted;' в последней строке, потому что он никогда не будет достигнут. – Greg01re

+1

Downvote, потому что ваш ответ добавляет только NULL-проверку указателя, которая ничего не изменит в тех случаях, которые задает вопросник. И он игнорирует другие проблемы, о которых я уже прокомментировал. Ваш ответ должен быть комментарием или быть улучшенным. –

Смежные вопросы