我在 C 中使用 return 的 decToBase 方法出错
Error with my decToBase method in C with a return
我正在使用 C 语言开发一种方法,试图将小数转换为其基数。我在 returning 一个 Char* 时遇到了问题。我仍然不确定如何 return 指针。当我编译这段代码时,我收到一条警告说
"warning: function returns address of local variable [-Wreturn-local-addr]"。
这与我的res性格有关。我不确定为什么我不能 return res,如果它是一个字符。如果我不能 return res,我不明白我应该 return 做什么。请帮忙。
//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] = '[=11=]';
// Reverse the result
strev(res);
return res;
int main()
{
char* base = decToBase(16, 248);
}
无论如何,我想要的结果是方法return "f8"作为结果。
在您的 decToBase()
函数中,它警告的问题是 char res[500];
的使用,这是一个作为局部变量分配在堆栈上的数组。当函数 returns 时,这些都被丢弃了,所以如果你 return 一个指向(或:地址) res
数组的指针,这个指针指向堆栈上的垃圾。
您必须找到一些其他方法来管理此分配,尽管有些人可能建议使用 malloc()
从系统分配内存,但这可能不是一个好主意,因为它要求解决内存泄漏问题。
更好的方法是传入您希望它填充的缓冲区,然后使用它。然后 caller 进行分配,你不用担心内存泄漏。
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] = '[=10=]';
// 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
有多大,溢出是有可能的,所以经验and/or偏执的程序员也会传入 outbuf 的大小,以便您的函数知道要使用多少。
但那是您稍后要进行的步骤。
我正在使用 C 语言开发一种方法,试图将小数转换为其基数。我在 returning 一个 Char* 时遇到了问题。我仍然不确定如何 return 指针。当我编译这段代码时,我收到一条警告说
"warning: function returns address of local variable [-Wreturn-local-addr]"。 这与我的res性格有关。我不确定为什么我不能 return res,如果它是一个字符。如果我不能 return res,我不明白我应该 return 做什么。请帮忙。
//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] = '[=11=]';
// Reverse the result
strev(res);
return res;
int main()
{
char* base = decToBase(16, 248);
}
无论如何,我想要的结果是方法return "f8"作为结果。
在您的 decToBase()
函数中,它警告的问题是 char res[500];
的使用,这是一个作为局部变量分配在堆栈上的数组。当函数 returns 时,这些都被丢弃了,所以如果你 return 一个指向(或:地址) res
数组的指针,这个指针指向堆栈上的垃圾。
您必须找到一些其他方法来管理此分配,尽管有些人可能建议使用 malloc()
从系统分配内存,但这可能不是一个好主意,因为它要求解决内存泄漏问题。
更好的方法是传入您希望它填充的缓冲区,然后使用它。然后 caller 进行分配,你不用担心内存泄漏。
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] = '[=10=]';
// 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
有多大,溢出是有可能的,所以经验and/or偏执的程序员也会传入 outbuf 的大小,以便您的函数知道要使用多少。
但那是您稍后要进行的步骤。