【问题标题】:Memory allocation and leaking issue?内存分配和泄漏问题?
【发布时间】: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 &lt;&lt; j)

标签: c memory-management memory-leaks malloc


【解决方案1】:

然而,十六进制数返回某种奇怪的数字(由于内存泄漏问题?)。

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

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

所以 sum 的值是未定义的

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

【讨论】:

  • @SangminChoi 欢迎您,祝您编码愉快,并使用 valgrind,该工具简直是魔法 ;-)
【解决方案2】:

问题出在这里:

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

hex 索引从03,因此分配给hex[23] 会导致未定义的行为。然后你尝试打印hex 的元素,这些元素你从未真正填写过。

你需要:

hex[i - 23] = s[i] - '0';

【讨论】:

  • 糟糕。现在我可以看到问题了。谢谢你的建议:)
猜你喜欢
  • 1970-01-01
  • 2016-09-12
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
相关资源
最近更新 更多