2016-11-10 34 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位是ON還是OFF,如果是ON,則打印「1」,否則打印「0」。現在檢查第30位是ON還是OFF,如果是ON,則打印「1」,否則打印「0」,對於從31到0的所有位執行此操作,最後我們將得到數字的二進制表示。

我很困惑應該用多少空間來存儲32位整數。以及如何釋放分配給結果的內存。請幫助我解決這個問題。

+1

'Ĵ =(unsigned int)結果;'...爲什麼?整數轉換指針與實現高度相關。如果需要,使用'uintptr_t'。 –

+0

不要使用強制轉換來消除編譯器錯誤。相反,問你做錯了什麼。 –

+0

@SouravGhosh更好地問爲什麼'j'需要首先是任何類型的整數。 –

回答

2

您將需要分配32字節(至少)存儲對應於各個位1或0在正考慮1的數據類型和存儲0是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)字節)。它只是指向相同的內存。所以即使它的作用域在bin()函數中,由malloc函數創建的結果指針指向的內存範圍仍然會一直存在,直到程序結束。 –

0

32位的整數值徵收使用signed longunsigned long

在功能bin只需使用*result你需要存儲你的結果 然後return(result);

在主要使用*result以及和free(result);當所有的時間你完成了結果

另外,爲什麼不簡單unsigned long bin(long);

最後,你的功能什麼都不做!應該像void bin(long, char[33]);(無malloc需要)或char* bin(long);(用malloc

+0

對於我在函數bin()中聲明的靜態指針*結果,您有何看法?即使我不聲明它是靜態的,它也可以工作。但是如果它沒有聲明爲靜態的,它的類就變成了自動的,並且它的作用域將在函數bin()中,並且一旦函數bin()完成執行,它就會被正確地銷燬?但即使它的自動指針仍然有效。爲什麼這樣? –

+0

不完全。如果'result'是一個指向malloc'ed數據的指針,則通過'return(result);'返回malloc'ed數據的地址。在'bin'範圍內保留這個地址的內存位置丟失了,但你不在乎。什麼會是一個錯誤會像'返回(&結果);'。 – 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); 
} 
相關問題