在这段代码中,我试图将十进制数转换为二进制数。 (是的,我知道存在这样的功能 - 我试图重新发明轮子作为练习。)因为我使用函数toBinNum()
来转换数字,我想通过引用传递一个空数组,然后将我的二进制数字存储在数组中,并在返回main()
函数时,我将拥有数组binNum
。这不会发生;我传递指针,初始化它并存储我的二进制数字,但是当我返回main()
并尝试访问指针时,它失败,发出"Access violation on pointer"
错误。我假设内存正在被释放,虽然我无法弄清楚为什么,因为指针的范围在main()
,而new
关键字在{{{当我在其中创建数组时。为什么这不起作用,我该如何解决?
toBinNum()
答案 0 :(得分:3)
通过引用传递指针
cout << (long long int)(this) << endl;
cout << (long long int)((B *)this) << endl;
在C中你可以再使用一个间接
void toBinNum(int, int* &, int&);
函数声明的问题是任何未通过引用传递的参数(尽管引用也是函数的局部变量)是退出函数后销毁的函数的局部变量。局部变量的任何更改都不会影响原始参数。
您可以通过以下方式设想函数调用。让我们假设您有一个声明为
的函数void toBinNum(int, int**, int*);
您可以通过以下方式调用
void f( int *p );
那么函数定义可以想象为
int main()
{
int *q = nullptr;
f( q );
//...
如您所见,void f( /* int *p */ )
{
int *p = q;
p = new int;
//...
参数未被更改。它是局部变量q
,它获得了一个新值。
答案 1 :(得分:1)
我知道这个回复不是问题的正确答案(我在问题上面的评论中回答),但我认为这是一个很好的解决方案来转换二进制格式的数字。 但是,它会向您显示在不使用**
或&*
的情况下在函数调用之外分配资源的想法。
我使用下面的代码打印出整数的二进制转换。在这样的代码中,我使用函数iToBin()
将整数转换为可以打印或使用任何你想要的字符数组。此函数还使用可选参数 - sym
- 可用于指定要将哪些“符号”插入到数组中而不是符号“0”和“1”。函数iToBin()
将高位编码到buff
数组的第一个元素中,然后buff[0]
是转换后的数字的高位。
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<stdint.h>
using namespace std;
char * iToBin(uint64_t n, char *buff, int len, const char *sym=(const char []){'0','1'});
char * iToBin(uint64_t n,char *buff,int len, const char *sym)
{
uint64_t k=1;
*(buff+ --len)=0;
do {
*(buff+ --len)=(n&k)?sym[1]:sym[0];
k<<=1;
} while(k && len);
return buff;
}
int main(void) {
uint64_t value;
int len=0;
char * buff;
buff=new char[sizeof(value)*8+1];
if (buff==NULL) {
cout << "Not enough memory" << endl;
return 1;
}
do {
cout << "Insert the value to convert: ";
cin >> value;
//len=(log2(value)+1); //number of digit
//len++; // to insert the string0 terminator
//It's better to use this to compute the number of bits!
len=64;
while(!(value & (1ULL<<(len-1))) && len>1) len--;
len++; //to insert string 0 terminator
iToBin(value,buff,len);
int numOnes=0;
for(int i=0;i<len-1;i++) {
if (buff[i]=='1') {
numOnes++;
}
}
cout << buff << " contains " << numOnes << " 1" << endl;
} while(value!=0);
delete buff;
return 0;
}
您也可以使用不同的符号来输出不同的信号,在下面的情况下,您将有一个输出,其中1位数字为“+”,0位数字为“ - ”。 (iToBin()
可以直接用于打印输出结果,因为它返回数组指针值)
char sym[2];
sym[0]='-';sym[1]='+';
cout << iToBin(value,buff,len,sym) << endl;
您可以使用下面的代码来获得一个代码,其中的位由0和1数字值表示:
sym[0]=0;sym[1]=1;
但是缓冲区结果将不会用作以C 0结尾的字符串!