从函数返回字符指针

时间:2011-07-24 07:43:19

标签: c++

我从计算中获得了一个带有小数部分为0的双精度值,然后想要将此值转换为由数字组成的字符数组(使用ascii代码),然后返回它...我为它编写了以下代码...

char* as_string(double a,char* ptr)
{
  int digits=0;
  for(int i=1;;i++)
  {if(static_cast<int>(a/pow(10.0,i))==0)
  {digits=i;
  break;}
  }

 char b[digits];
 for(int i=digits-1;i>=0;i--)
 {
 b[digits-1-i]=static_cast<int>(a/pow(10.0,i))+48;
 a=a-((b[digits-1-i]-48)*pow(10.0,i));
 }

 strncpy(ptr,b,digits);
 return ptr;
}     
一切都没事了......没有语法错误,但是在运行时每次都重写了...经过一番审查后我发现错误发生在指针ptr和strcpy语句周围(因为数组b是成功测试填充数字)...任何人都可以PLZ。指出错误?

5 个答案:

答案 0 :(得分:5)

没有必要重新发明轮子。

这样的东西应该可以正常工作(请注意,因为你使用的是C ++,我把它变成了std::string):

std::string as_string(double a) {
    std::ostringstream ss;
    ss << a;
    return ss.str();
}

答案 1 :(得分:3)

你需要为ptr分配足够的内存来存储b的内容,除非你在将它传递给你的函数之前已经完成了(因为你把ptr作为第二个参数)。

答案 2 :(得分:3)

你应该问问自己这个问题:

ptr是否指向一个足以容纳digits的内存位置?
我不这么认为。

问题是你正在向函数传递一个指针ptr,但你事先并不知道需要将多少内存分配给ptr

您可以选择两个选项:

您可以猜测可能的最大值使用ptr或在堆栈&amp;上为new分配相同的值。然后将ptr传递给函数

使用ptr在函数内部为new分配内存,您可以确切地知道需要多少内存。请注意,要这样做,您必须将ptr作为双指针传递。

答案 3 :(得分:2)

我强烈怀疑你传递给函数的指针没有指向有效的内存。 例如,以下内容将导致未定义的行为(包括但不限于崩溃)。

char x;
as_string(0.232, &x); //UB
char y[too_small_size];
as_string(0.344, y); //UB

答案 4 :(得分:0)

  • 当你返回指针然后你不需要传递它时,你可以在函数内部分配一些内存并简单地返回它。
  • 如果您通过指针发送内存位置,则可能返回该值,但检查传递的内存位置是否为NULL。调用时确保它是有效的内存位置。
  • 始终确保指针指向的内存块足够大,即它的位置大于digits