【发布时间】:2019-05-06 16:21:19
【问题描述】:
我正在研究 print_selected(int x) 函数,它采用 x 然后提取位 5、6、7 和 8(从最右边的位 0 开始)
然后将它们打印在两个二进制文件中,然后以十六进制打印。
在print_selected(int x)和int2bin(int)中有一个辅助函数int2bin(int n),函数返回一个char类型数组给s。
问题是我可以正确打印出 5、6、7 和 8 位的二进制数,但是,十六进制数返回了某种奇怪的数字(由于内存泄漏问题?)。
我强烈怀疑print_selected(int) 中的char* s = int2bin(x) 和free(s) 可能是问题所在,但我不知道应该更改哪个部分才能正确打印出正确的十六进制数字。
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
// takes integer and returns char array with 32 binary number.
char* int2bin(int n)
{
int nbits = sizeof(n) * 8;
char *s = malloc(nbits + 1);
s[nbits] = '\0';
unsigned int u = *(unsigned int*)&n;
int i;
unsigned int mask = 1 << (nbits - 1);
for (i = 0; i < nbits; i++, mask >>= 1)
s[i] = ((u & mask) != 0) + '0';
return s;
}
// takes an integer and print in "binary" and "hexadecimal".
void print_selected(int x)
{
int hex[4]; // to store the 4 bits of (5,6,7,8)
int i;
char *s = int2bin(x); // I think this part makes problem?
printf("bits 5 to 8 in bin: ");
for (i = 23; i <= 26; i++)
{
printf("%d", s[i] - '0');
hex[i] = s[i] - '0';
}
free(s); // I think this part makes problem?
printf("\n");
int j = 3; // since we already know the number of bits,
int sum = 0;
for (i = 0; i <= 3; i++)
{
sum = sum + (hex[i] * pow(2, j));
j--;
}
printf("in hex: 0x%x\n", sum);
}
int main(void)
{
int a = 278;
print_selected(a);
}
【问题讨论】:
-
free(s)没有问题。你不再使用那段内存了。 -
pow(2, j)存在编译器警告。你不需要数学,只需(1 << j)。
标签: c memory-management memory-leaks malloc