gpt4 book ai didi

c - 内存分配和泄漏问题?

转载 作者:太空宇宙 更新时间:2023-11-04 06:11:17 30 4
gpt4 key购买 nike

我正在研究 print_selected(int x) 函数,它接受 x 然后提取位 5、6、7 和 8(从位 0 开始最右边)然后在两个二进制文件中打印它们,然后以十六进制打印。

print_selected(int x) 中有一个辅助函数,int2bin(int n)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);
}

最佳答案

however, the hexadecimal number returns somehow weird number(due to the memory leaking issue?).

不,你访问的是未初始化的内存

for (i = 0; i <= 3; i++)
{
sum = sum + (hex[i] * pow(2, j));
j--;
}

因为hex只在

中初始化
for (i = 23; i <= 26; i++)
{
printf("%d", s[i] - '0');
hex[i] = s[i] - '0';
}

所以对于索引 23 到 26,而不是索引 0 到 3

请注意,您还写出了 hex,具有未定义的 bahevior,您需要使用索引 i -23 来编写 hex/p>

所以 sum 的值是未定义的

我鼓励你使用 valgrind 来检测你的内存问题,我用它来回答你

关于c - 内存分配和泄漏问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56008997/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com