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。代替字符数组;无需因内存分配问题而使代码复杂化。