我正在尝试使用C转换一个十进制数,而我的功能是在第一部分做对了,但第二部分没有做。应该将数字的余数除以2,然后将这些数字存储在数组中,然后返回数组但取反。我的代码是:
int* showbits(int decNum){
int originalBits[32];
int i;
for(i = 0; i < 32; i++){
int temp = decNum % 2;
originalBits[i] = temp;
decNum = decNum / 2;
}
int a;
for (a = 0; a < 32; a++){
printf("%d ", originalBits[a]);
}
printf("\n");
int j = 0;
int k = 32;
int bits[32];
for (j = 0; j < 32; j++){
for (k = 32; k > 0; k--){
bits[j] = originalBits[k];
}
}
int m;
for (m = 0; m < 32; m++){
printf("%d ", bits[m]);
}
return bits;
}
如果我输入函数255,输出将全1。我还尝试将最后一个循环替换为:
for (j = 0; j < 32; j++){
bits[j] = originalBits[k--];
}
但是它错过了一个数字,并且为255,给出了1111111而不是11111111
答案 0 :(得分:2)
这根本没有道理:
for (j = 0; j < 32; j++)
{
for (k = 32; k > 0; k--)
{
bits[j] = originalBits[k];
}
}
我认为您想在这里虔诚,但是请考虑您在做什么。
您正在使用j
的一个循环迭代将originalBits
的每个元素写入bits[0]
,然后对bits[1]
做同样的操作并继续。这意味着最后每个位的值都为originalBits[0]
。
这里一个循环就足够了,您只需要从数组的另一侧开始读取即可:
for (j = 0; j < 32; j++)
{
bits[j] = originalBits[31-j];
}
通过这种方式,您可以从originalBits
的末尾开始读取,并从bits
的末尾开始写入。足够反转内容。
除此之外,您不能返回指向该函数本地数组的指针。
int bits[32];
在到达函数末尾时将无效,但会将其地址传递给调用方。这是未定义的行为,必须避免。
要么创建一个具有静态存储持续时间的数组,例如通过在文件范围内将其声明为全局变量。
或者您可以使用malloc动态获取内存,
int *bits = malloc(32 * sizeof *bits);
但是您必须确保还释放分配的内存。
另一种可能性是在main
中声明该数组并将地址传递给该函数,然后您就可以对其进行写操作,甚至不必返回任何内容。
答案 1 :(得分:1)
关于版本1:
内循环结束时,k
始终为0。
for (j = 0; j < 32; j++){
for (k = 32; k > 0; k--){
bits[j] = originalBits[k];
}
}
这意味着在嵌套循环之后,每个bits[j]
都将保留originalBits[0]
的值。
解决方案:
for (j = 0; j < 32; j++){
bits[j] = originalBits[31-j];
}
关于版本2:
您从k=32
开始,并在每次迭代中使用之后递减:
for (j = 0; j < 32; j++){
bits[j] = originalBits[k--];
}
这意味着您将在数组中以originalBits[32]
... originalBits[1]
结尾。
这是超出范围的访问,并且也缺少最后一个元素。
解决方案是这样的:
for (j = 0; j < 32; j++){
bits[j] = originalBits[31-j];
}
作为一般提示: 使用调试器可以很容易地发现这种类型的错误。逐步执行循环,观察索引变量,对其进行修复。
有关返回指向非静态数组的指针的更新:
int* showbits(int decNum)
{
int bits[32];
...
return bits;
}
在离开该功能后,bits
将变为无效。这会使指针无效。
您可以通过不同的方式解决此问题:
如果在使用数组之前没有同时从多个线程或多个值中调用函数:
int* showbits(int decNum)
{
static int bits[32];
...
return bits;
}
现在数组将保持有效,您的指针也将保持有效。如果再次调用该函数,则会使用相同的数组,从而更改以前的调用中的位。
如果您需要其他缓冲区:
int* showbits(int decNum)
{
int *bits = malloc(sizeof(*bits)*32);
...
return bits;
}
然后,您需要在调用函数中free
之后使用指针。