C++ 当字符串从函数返回时,如果前面有和结束行,则打印不正确 char*fractToBin(无符号长数值) { char-bin[100]; 对于(int i=0;i

C++ 当字符串从函数返回时,如果前面有和结束行,则打印不正确 char*fractToBin(无符号长数值) { char-bin[100]; 对于(int i=0;i,c++,arrays,char,C++,Arrays,Char,您返回一个指向局部变量的指针。它有时工作的事实是未定义行为的一部分 temp=bin;只分配指向bin地址的指针,并泄漏您分配的内存,因为您不再有指向它的指针来删除它 使用strcpy将数据从bin复制到temp,或者直接使用temp而不是bin返回指向局部变量的指针。它有时工作的事实是未定义行为的一部分 temp=bin;只分配指向bin地址的指针,并泄漏您分配的内存,因为您不再有指向它的指针来删除它 使用strcpy将数据从bin复制到temp或直接使用temp而不是bin问题来自代码的以下

您返回一个指向局部变量的指针。它有时工作的事实是未定义行为的一部分

temp=bin;
只分配指向
bin
地址的指针,并泄漏您分配的内存,因为您不再有指向它的指针来删除它


使用
strcpy
将数据从
bin
复制到
temp
,或者直接使用
temp
而不是
bin
返回指向局部变量的指针。它有时工作的事实是未定义行为的一部分

temp=bin;
只分配指向
bin
地址的指针,并泄漏您分配的内存,因为您不再有指向它的指针来删除它


使用
strcpy
将数据从
bin
复制到
temp
或直接使用
temp
而不是
bin
问题来自代码的以下部分:

char *fractToBin(unsigned long long num)
{
  char bin[100];
  for(int i=0; i<23; i++)
      bin[i] = '0';
  bin[23] = '\0';

  char *temp = new char[100];
  int count = 0;
  int i;
  int it = num;

  while(num != 0)
  {
      count++;
      num /= 10;
  }

  int base = pow(10, count);

  for(i = 0; i<23; i++)
  {
      it = it * 2;
      if(it > base)
      {
        it = it - base;
        bin[i] = '1';
      }
      else if(it < base) 
        bin[i] = '0';
      else if (it == base)
      {
        bin[i] = '1';
        break;
      }
  }
  temp = bin;

  return temp;
}

int main()
{
  char *s;
  s = fractToBin(625);
  cout << endl; //if this is here then it prints out wrong value
  cout << s << endl;
  return 0;
}
如果在此处声明静态选项卡,则此指针仅在作用域存在期间有效

char bin[100];
在这里,您分配了一个新指针,使用new关键字,您必须在使用完该指针后删除它

char *temp = new char[100];
在这里,您可以在temp中复制本地指针(bin)的地址。这将复制指针的地址而不是内容。您必须在新指针中复制内容才能正确执行此操作。
通过返回bin的地址,您可以返回“空闲”内存上的指针。这意味着它可以被任何其他程序重用。通过打印std::enld,程序可能正在重用释放的内存部分并弄乱数据。

问题来自代码的以下部分:

char *fractToBin(unsigned long long num)
{
  char bin[100];
  for(int i=0; i<23; i++)
      bin[i] = '0';
  bin[23] = '\0';

  char *temp = new char[100];
  int count = 0;
  int i;
  int it = num;

  while(num != 0)
  {
      count++;
      num /= 10;
  }

  int base = pow(10, count);

  for(i = 0; i<23; i++)
  {
      it = it * 2;
      if(it > base)
      {
        it = it - base;
        bin[i] = '1';
      }
      else if(it < base) 
        bin[i] = '0';
      else if (it == base)
      {
        bin[i] = '1';
        break;
      }
  }
  temp = bin;

  return temp;
}

int main()
{
  char *s;
  s = fractToBin(625);
  cout << endl; //if this is here then it prints out wrong value
  cout << s << endl;
  return 0;
}
如果在此处声明静态选项卡,则此指针仅在作用域存在期间有效

char bin[100];
在这里,您分配了一个新指针,使用new关键字,您必须在使用完该指针后删除它

char *temp = new char[100];
在这里,您可以在temp中复制本地指针(bin)的地址。这将复制指针的地址而不是内容。您必须在新指针中复制内容才能正确执行此操作。
通过返回bin的地址,可以返回“free”上的指针内存。这意味着它可以被任何其他程序重复使用。通过打印std::enld,程序可能会重复使用释放的内存部分并干扰数据。

这将是您在函数中为本地数组分配
temp
地址:
temp=bin;
,这将是您将该地址作为f返回UnToice结果:<代码>返回临时;并在调用方对所述地址进行评估时调用未定义的行为。内存泄漏是最终的侮辱。请考虑使用<代码> STD::String < /Cord>代替字符数组;不必使代码复杂化,内存分配问题。这将是您分配的代码> TEMP。您的函数中的本地数组的地址:<代码> TEMP= bin;< /代码>,这将使您返回该地址作为您的函数结果:<代码>返回临时;并在调用方侧对所述地址进行评估时调用未定义的行为。内存泄漏是最终的侮辱。请考虑使用<代码> STD::String < /代码> INS。代替字符数组;无需因内存分配问题而使代码复杂化。