簡體   English   中英

內存分配和泄漏問題?

[英]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索引從03 ,因此分配給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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM