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 

Der Zweck dieses Programms ist, Dezimalzahl in Binärzahl zu konvertieren. Die Hauptfunktion ruft die Funktion bin() auf, um dezimal in binär zu konvertieren.Warum gibt der Zeiger von der aufgerufenen Funktion den Wert nicht zur aufrufenden Funktion zurück?

Logik des Codes: - Nehmen wir vorzeichenlose Ganzzahl (32 Bit), die aus 0-31 Bits bestehen. Um eine Binärdarstellung einer Ganzzahl ohne Vorzeichen zu drucken, beginnen Sie mit dem 31. Bit, prüfen Sie, ob das 31. Bit EIN oder AUS ist, wenn es EIN ist, drucken Sie "1", andernfalls drucken Sie "0". Jetzt überprüfe, ob das 30. Bit EIN oder AUS ist, wenn es EIN ist, drucke "1", sonst drucke "0", mach das für alle Bits von 31 bis 0, schließlich werden wir eine Binärdarstellung der Zahl erhalten.

Ich bin verwirrt, wie viel Platz malloced werden sollte, um 32bits von Ganzzahl zu speichern. Und wie man Speicher freigibt, der zum Ergebnis zugeteilt wird. Bitte helfen Sie mir mit diesem Code aus.

+1

'j = (unsigned int) Ergebnis; '... warum ?? Zeiger auf Integer-Konvertierung ist stark abhängig von der Implementierung. Benutze 'uintptr_t' wenn nötig. –

+0

Verwenden Sie keine Umwandlungen, um Compilerfehler stummzuschalten. Frag stattdessen, was du falsch machst. –

+0

@SouravGhosh besser fragen, warum 'j' in erster Linie eine ganze Zahl von irgendeinem Typ sein muss. –

Antwort

2

Sie müssen Speicher von 32bytes zuzuweisen (mindestens) zum Speicher von 1 oder 0 bis jedes Bit in n entsprechend den Datentyp von 1 unter Berücksichtigung und 0 sein char. Außerdem empfehle ich int als Datentyp zu verwenden und 32x4 (Bytes) Speicher zuzuweisen. Hier ist das wahrscheinlich die endgültige Code soll wie folgt aussehen:

#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

Sie sollten am Ende von 'main'' free (result) 'sein. –

+0

Was ist Ihre Meinung zu dem statischen Zeiger * Ergebnis, das ich in der Funktion bin() deklariert habe? Es funktioniert auch, wenn ich es nicht als statisch deklariere. Aber wenn es nicht als statisch deklariert wird, wird seine Klasse automatisch und ihr Bereich wird innerhalb der Funktion bin() liegen und sobald die Funktion bin() die Ausführung beendet, wird sie korrekt zerstört. Aber es funktioniert immer noch, selbst wenn sein automatischer Zeiger. Warum? –

+0

Weil hier result hat keinen Speicher (32 * sizeof (unsigned int) Bytes) in sich. Es zeigt nur auf den gleichen Speicher. Selbst wenn der Gültigkeitsbereich innerhalb der Funktion bin() liegt, bleibt der Speicherbereich, auf den der Ergebniszeiger zeigt, der zuvor von der malloc-Funktion erstellt wurde, bis das Programm beendet ist. –

0

32-Bit ganzzahlige Werte aufzuzwingen bin*result nutzen die Zeit, alles, was Sie gerade signed long oder unsigned long

In Funktion verwenden müssen Ihr Ergebnis dann return(result);

Im Haupt Verwendung speichern *result auch und free(result); wenn Sie sind fertig mit dem Ergebnis

Auch warum nicht einfach unsigned long bin(long);?

Schließlich macht Ihre Funktion absolut nichts! sein sollte wie void bin(long, char[33]); (keine malloc erforderlich) oder char* bin(long); (mit malloc)

+0

Was ist Ihre Meinung zu dem statischen Zeiger * Ergebnis, das ich in der Funktion bin() deklariert habe? Es funktioniert auch, wenn ich es nicht als statisch deklariere. Aber wenn es nicht als statisch deklariert wird, wird seine Klasse automatisch und ihr Bereich wird innerhalb der Funktion bin() liegen und sobald die Funktion bin() die Ausführung beendet, wird sie korrekt zerstört. Aber es funktioniert immer noch, selbst wenn sein automatischer Zeiger. Warum? –

+0

Nicht ganz. Wenn "result" ein Zeiger auf malloc-Daten ist, geben Sie mit return (result) die Adresse der malloc-Daten zurück. Der Speicherort, der diese Adresse im Bereich 'bin' gespeichert hat, ist verloren, aber es ist Ihnen egal. Was wäre ein Fehler wäre etwas wie 'return (& result);'. – Djee

1

Shubham, ich glaube wirklich, Sie in der falschen Richtung als erstes gehen gibt es nicht so etwas wie eine Dezimalzahl oder binäre Integer. Lassen Sie mich schlage vor, Sie daran zu arbeiten, die möglicherweise Ihr Problem lösen, indem malloc und keine static Zeiger, der nicht benötigt wird:

/* 
* 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); 
} 

und Ihr Haupt wird Licht, aber auch:

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); 
} 
Verwandte Themen