[英]Memory allocation and leaking issue?
我正在使用print_selected(int x)
函數,該函數使用x
然后提取位5、6、7和8(從最右邊的位0開始),然后在兩個二進制文件中以十六進制形式打印它們。
有一個輔助函數, int2bin(int n)
中的print_selected(int x)
和int2bin(int)
函數將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);
}
問題在這里:
for (i = 23; i <= 26; i++)
{
printf("%d", s[i] - '0');
hex[i] = s[i] - '0';
}
hex
索引從0
到3
,因此分配給hex[23]
會導致未定義的行為。 然后,您嘗試打印hex
的元素,而您從未真正填寫過。
你需要:
hex[i - 23] = s[i] - '0';
但是,十六進制數會以某種方式返回怪異的數字(由於內存泄漏問題?)。
不,您訪問的是未初始化的內存
for (i = 0; i <= 3; i++) { sum = sum + (hex[i] * pow(2, j)); j--; }
因為十六進制僅在
for (i = 23; i <= 26; i++) { printf("%d", s[i] - '0'); hex[i] = s[i] - '0'; }
因此對於索引23到26,而不是索引0到3
請注意,您還用未定義的行為寫出了hex ,還需要使用索引i -23
來編寫hex
所以總和的值是不確定的
我鼓勵您使用valgrind來檢測您的內存問題,我用它來回答您
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.