Ошибка с моим методом decToBase в C с возвратом - PullRequest
0 голосов
/ 30 октября 2019

Я работаю над методом в C, где я пытаюсь преобразовать десятичное число в его основание. У меня проблемы с возвратом Char *. Я все еще не уверен, как вернуть указатель. Когда я компилирую этот код, я получаю предупреждение:

"предупреждение: функция возвращает адрес локальной переменной [-Wreturn-local-addr]". и это связано с моим характером res. Я не уверен, почему я не могу вернуть res, если это символ. Я не понимаю, что я должен вернуть, если я не могу вернуть Res. Пожалуйста помоги.

 //return res;


char reVal(int num)
{
 if (num >= 0 && num <= 9)
 return (char)(num + '0');
 else if(num = 10)
 {
 return (char)(num - 10 + 'A');
 }
 else if(num = 11)
 {
 return (char)(num - 11 + 'B');
 }
 else if(num = 12)
 {
 return (char)(num - 12 + 'C');
 }
 else if(num = 13)
 {
 return (char)(num - 13 + 'D');
 }
 else if(num = 14)
 {
 return (char)(num - 14 + 'E');
 }
 else if(num = 15)
 {
 return (char)(num - 15 + 'F');
 }
}


// Utility function to reverse a string 
void strev(char *str)
{
  int len = strlen(str);
  int i;
  for (i = 0; i < len/2; i++)
  {
     char temp = str[i];
     str[i] = str[len-i-1];
     str[len-i-1] = temp;
  }
}

char* decToBase(int base, int dec)
{
int index = 0; // Initialize index of result 
char res[100]; // Convert input number is given base by repeatedly 
               // dividing it by base and taking remainder 
while (dec > 0)
{
    res[index++] = reVal(dec % base);
    dec /= base;
}

res[index] = '\0';
// Reverse the result 
strev(res);
return res;

int main()
{
    char* base = decToBase(16, 248);
}

Независимо от того, какой результат я хочу получить, это иметь метод, возвращающий "f8" в качестве результата.

1 Ответ

1 голос
/ 30 октября 2019

В вашей функции decToBase() проблема, о которой она предупреждает, заключается в использовании char res[500];, который является массивом, размещенным в стеке как локальная переменная. Все они отбрасываются при возврате функции, поэтому, если вы возвращаете указатель на (или: адрес) массива res, этот указатель указывает на мусор в стеке.

Вы должны найти некоторыеДругой способ управлять этим распределением, и хотя некоторые могут предложить использовать malloc() для выделения памяти из системы, это, вероятно, плохая идея, поскольку она требует проблем с утечками памяти.

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

char *decToBase(int base, int dec, char *outbuf)
{
int index = 0; // Initialize index of result 
               // Convert input number is given base by repeatedly 
               // dividing it by base and taking remainder 
   while (dec > 0)
   {
      outbuf[index++] = reVal(dec % base);
      dec /= base;
   }

   outbuf[index] = '\0';
   // Reverse the result 
   strev(outbuf);
   return outbuf;
}

, и тогда ваша main функция будет выглядеть так:

int main()
{
   char decbuf[500];

   decToBase(16, 248, decbuf);
   printf("Buffer is %s\n", decbuf);
}

Это все еще не супер идеал, потому что ваша decToBase() функция не знает, насколько велика outbuf, и возможны переполнения, поэтому опытный и / или параноидальный программист также передаст размер outbuf, чтобы ваша функция зналасколько нужно использовать.

Но это шаг, к которому вы придете позже.

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