2013-11-09 50 views
0

我試圖讓這個程序工作,但我失敗了。我不知道我錯在哪裏。 我得到分段錯誤。這可能是錯誤是由於指針不起作用。二進制分割錯誤轉換

#include <stdio.h> 
#include <stdlib.h> 

void ConvertBin(int n, int *ris,int *bit); 

int main(int argc, char *argv[]) 
{ 
    int n; 
    int ris[20]; 
    int bit; 

    printf("Insert num: "); scanf("%d", &n); 

    ConvertBin(n,ris,&bit); 

    for (int i=bit; i!=0; i--) 
    { 
     printf("%d", *(ris+i)); 
    } 

    return 0; 
} 

void ConvertBin(int n, int *ris, int *bit) 
{ 
    int i = 0; 

    while (n!=0) 
    { 
     *(ris+i) = n%2; 
     n = n/2; 
     i++; 
    } 

    bit = &i; 
} 

回答

2

錯誤出現在函數的最後一行。 bit = &i;bit設置爲局部變量i的地址(變量從函數返回後不再存在)。之後不使用bit的值,實際上該函數的最後一行完全沒有效果。並且調用函數(main)未收到其變量的更新值bit變量。

你需要寫*bit = i;代替:這個會寫的i值放入變量指向由bitmainbit你的情況)。

+0

現在確定它可以工作,但不完全。它被執行,但我沒有得到我方面的結果。例如,如果我插入數字3,我將得到15785073521 – Mazzy

+1

這可能是因爲你已經填充了'ris [0 ... bits-1]',但是你正在打印'ris [1 ... bits]'。試試'printf(「%d」,ris [i-1]);'(或者* *(ris + i-1)'如果你喜歡這種形式)。 – Inspired

+0

是的,當然......多麼愚蠢的錯誤......非常感謝你! – Mazzy

0

問題出在變量i,它比應該大一點。 這應該工作正常:

#include <stdio.h> 
#include <stdlib.h> 

void ConvertBin(int n, int *ris,int *bit); 

int main(int argc, char *argv[]) 
{ 
    int n; 
    int ris[20]; 
    int bit; 

    printf("Insert num: "); scanf("%d", &n); 

    ConvertBin(n,ris,&bit); 

    for (int i=bit; i>=0; i--) 
    { 
     printf("%d", *(ris+i)); 
    } 

    return 0; 
} 

void ConvertBin(int n, int *ris, int *bit) 
{ 
    int i = 0; 

    if(!n){ 
     *(ris) = 0; 
     i++; 
    } else{ 
     i = 0; 
     do 
     { 
      *(ris+i) = n%2; 
      n = n/2; 
      i++; 
     } while (n!=0); 
    } 
    *bit = i -1; 
}