2016-11-10 3 views
0
#include<stdio.h> 
#include<stdlib.h> 
unsigned int *bin(int); 
int main(void) 
{ 
    unsigned int n=0,*i=NULL; 
    printf("Enter no:"); 
    scanf("%d",&n); 
    i=bin(n); 
    printf("Binary no: %d\n",*i); 
    return 0; 
} 
unsigned int *bin(int n) 
{ 
    unsigned int i=0,j=0; 
    static unsigned int *result=NULL; 
    result=(unsigned int*)malloc(1*sizeof(unsigned int)); 
    printf("Result=%p\n",result); 
    j=(unsigned int)result; 
    for(i=(1<<31);i>0;i=(i>>1)) 
    { 
    if(n & i) 
    { 
     *result=1; 
     result++; 
    } 
    else 
    { 
     *result=0; 
     result++; 
    } 
} 
    result=(unsigned int*)j; 
    printf("Result=%p\n",result); 
    return result; 
} 
Output : 
Enter no:6 
Address of Result=0x2576010 
Address of Result=0x2576010 
Binary no: 0 

Цель этой программы - преобразовать десятичное число в двоичное число. Основная функция - вызов функции bin() для преобразования десятичного в двоичный.Почему указатель от вызываемой функции не возвращает значение вызывающей функции?

Логика кода: - Возьмем целое число без знака (32 бит), состоящее из 0-31 бит. Чтобы напечатать двоичное представление целых чисел без знака, начните с 31-го бита, проверьте, включен ли 31-й бит или выключен, если он включен, напечатайте «1» еще раз «0». Теперь проверьте, включен или выключен 30-й бит, если он включен. Распечатайте «1», а затем «0», сделайте это для всех бит от 31 до 0, наконец, мы получим двоичное представление числа.

Я смущен, сколько места должно быть malloced для хранения 32 бит целого числа. И как освободить память, выделенную для результата. Пожалуйста, помогите мне с этим кодом.

+1

'J = (unsigned int) result; '... почему? указатель на целочисленное преобразование сильно зависит от реализации. используйте 'uintptr_t', если необходимо. –

+0

Не используйте приведения, чтобы отключить ошибки компилятора. Вместо этого спросите, что вы делаете неправильно. –

+0

@SouravGhosh лучше спросить, почему 'j' должно быть целым числом любого типа в первую очередь. –

ответ

2

Вам нужно будет выделять память 32 байта (по крайней мере) для хранения 1 или 0, соответствующий каждому биту в п учитывая тип данных 1 и 0 be char. Более того, я рекомендую иметь int как тип данных и выделять 32x4 (байты) памяти. Вот, вероятно, ваш окончательный код должен выглядеть следующим образом:

#include<stdio.h> 
#include<stdlib.h> 
unsigned int *bin(int); 
int main(void) 
{ 
    unsigned int n=0,*result =NULL; 
    printf("Enter no:"); 
    scanf("%d",&n); 
    result =bin(n); 
    printf ("binary representation is: "); 
    int i; 
    for (i=0;i<32;i++) 
    printf("%d ",result[i]); 
    free(result); 
    return 0; 
} 

unsigned int *bin(int n) 
{ 
    unsigned int i=0; 
    static unsigned int *result=NULL; 
    result=(unsigned int*)malloc(32*sizeof(unsigned int)); 
    printf("Result=%p\n",result); 
    unsigned int* j=NULL; 
    j=result; 
    for(i=(1<<31);i>0;i=(i>>1)) 
    { 
    if(n & i) 
    { 
     *j=1; 
     j++; 
    } 
    else 
    { 
     *j=0; 
     j++; 
    } 
} 

    return result; 
} 
+1

Вы должны «бесплатно (результат)» в конце 'main'. –

+0

Каково ваше мнение о статическом указателе *, который я объявил в функции bin(). Он работает, даже если я не объявляю его статичным. Но если его не объявлено статическим, его класс становится автоматическим, и его область будет находиться внутри функции bin(), и как только функция bin() завершит выполнение, она будет уничтожена правильно? Но все же он работает, даже если его автоматический указатель. Почему так? –

+0

Потому что здесь результат не имеет памяти (32 * sizeof (unsigned int) bytes) сам по себе. Это просто указывает на ту же память. Поэтому, даже если его область действия находится в функции bin(), область памяти, указанная указателем результата, которая ранее была создана функцией malloc, остается до тех пор, пока программа не закончится. –

0

32-разрядные целые значения налагают использовать signed long или unsigned long

В функции bin просто использовать *result все время вам нужно сохранить ваш результат затем return(result);

В главном использовании *result, а также и free(result); когда это вы закончили с результатом

Также почему не просто unsigned long bin(long);?

И, наконец, ваша функция абсолютно ничего не делает! Должно быть что-то вроде void bin(long, char[33]); (не malloc требуется) или char* bin(long);malloc)

+0

Что вы думаете о статическом указателе * result, который я объявил в функции bin(). Он работает, даже если я не объявляю его статичным. Но если его не объявлено статическим, его класс становится автоматическим, и его область будет находиться внутри функции bin(), и как только функция bin() завершит выполнение, она будет уничтожена правильно? Но все же он работает, даже если его автоматический указатель. Почему так? –

+0

Не совсем. Если 'result' является указателем на malloc'ed данные,' return (result); 'вы возвращаете адрес malloc'ed данных. Место памяти, в котором сохранен этот адрес в области «bin», теряется, но вам все равно. То, что было бы ошибкой, было бы чем-то вроде «return (& result);». – Djee

1

Shubham, я действительно думаю, что вы собираетесь в неправильном направлении, первым нет такого понятия, как десятичное или двоичное целое число. Позвольте мне предложить вам поработать над этим, который, возможно, решит вашу проблему, используя malloc и не static указатель, который не нужен:

/* 
* return a 32-bit long binary string from 'integer' 
* this string is dynamically allocated (malloc) 
* return NULL in case of error (so DON'T free it in this case) 
*/ 
char* bin(long integer) 
{ 
char* pChResult=malloc(33*sizeof(char)); 
char* pCh; 
unsigned long i; 
if(pChResult!=NULL) { 
    for(pCh=pChResult, i=1<<31; i>0; pCh++, i>>=1) { 
    if(i&integer) 
    *pCh='1'; 
    else 
    *pCh='0'; 
    } 
    *pCh='\0'; 
    } 
return(pChResult); 
} 

и ваш главный будет свет, а также:

int main(void) 
{ 
    unsigned int n; 
    char* result; 
    printf("Enter no:"); 
    scanf("%d",&n); 
    result = bin(n); 
    if(result==NULL) 
    { 
    fprintf(stderr, "internal error!\n"); 
    return(-1); 
    } 
    printf("binary representation is: %s\n", result); 
    free(result); 
    return(0); 
} 
Смежные вопросы