2017-03-13 22 views
1

動的配列の要素に値を割り当てようとしていますが、解決策が見つかりません。 scanfを介してユーザーが値を入力した場合の動作を示すビデオはたくさんありますが、ここではそうではありません。私は本当にここで、そこに情報を見つけようと自分で解決しようとしたので、どんな助けも高く評価されます。Cで動的配列に値を格納する方法

//Program co convert decimal number to binary and count zeros 
int main() 
{ 
    int decimalNum; 
    int *binaryNum; 
    int zeroCounter = 0; 
    int i = 0; 
    int sizeOfArray; 
    int decimalNumCopied; 


    printf("Please enter a number from 0 to 255: "); 
    scanf("%d", &decimalNum); 
    decimalNumCopied = decimalNum; 

    while(decimalNum != 0)//checking number of bits; 
    { 
     decimalNum = decimalNum/2; 
     i++; 
    } 
    sizeOfArray = i; 

    //Trying to allocate just enough memory 
    binaryNum = (int*)malloc(sizeOfArray * sizeof(int)); 


    while(decimalNumCopied != 0) 
    { 
     /*At next step I am trying to assign values to each element of the 
     array and it doesn't work 
     */ 
     binaryNum[i] = decimalNumCopied % 2; 
     decimalNumCopied = decimalNumCopied/2; 
     i--; 
    } 

    for(i = 0; i <= sizeOfArray; i++) 
    { 
     printf("%d", binaryNum[i]); 
     if(binaryNum[i]== 0){zeroCounter++;} 
    } 
    printf("\nThere are %d zeroes", zeroCounter); 

    free(binaryNum); 

    return 0; 
} 
+2

そして、何があなたのコードが間違っていますか?どのような問題がありますか?あなたの質問は何ですか*?しばらく時間を取って[良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask)を参照してください。 –

+1

また、[mallocの結果をキャストしない](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – UnholySheep

+1

を1つエラーでオフにします。有効な配列インデックスは '0'から' sizeOfArray - 1'です。 'while(decimalNumCopied!= 0)'の本文は、最初の繰り返しで 'binaryNum'の最後を1コピーします。 – Peter

答えて

4

あなたの最初の割り当てが配列の境界外です: はここに私のコードです。これにより、未定義の動作が得られます。

配列は0からインデックスされるので、iが配列の長さである場合、それは有効なインデックスではない(最後の有効なインデックスを超えたもの)。

+0

ありがとうございます。私は何とかポインタと何かを混同し、そのような明白な間違いを逃したと確信していました。 – libengazi

3

ここでは2つのエラーがあります。もしアレイiに値を割り当てる開始

まず、アレイ内の要素の数に等しいです。 Cの配列は0からn-1までのインデックスを持ちます。ここでnは長さです。配列の末尾を超えて1つの要素を書きます。そうすると、undefined behaviorが呼び出されます。この場合、(あなたにとって幸運なことに)クラッシュする可能性があります。

あなたは適切なオフセットで書き込みを開始するループに入る前に一度iをデクリメントする必要があります。

2番目の問題は印刷中です。 forループは0から開始されますが、i <= sizeOfArrayが真でなくなると停止します。したがって、最後の反復では、isizeOfArrayに等しいので、配列の最後を1つ上回る要素を読み取ってください。この場合も、未定義の動作が呼び出されます。

変更これを防ぐために<への条件:

for(i = 0; i < sizeOfArray; i++) 
0

私は、これはとても良いvalgrindのチェックは、いくつかのユーザー入力エラーで、ここでは固定されており、dbushと他の人が答えを組み込む有用なプログラムだと感じましたまた、コマンドラインからの入力も受け付けます。

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

int main(int argc, char**argv) { 
    int decimalNum; 
    int *binaryNum; 
    int zeroCounter = 0; 
    int i = 0; 
    int sizeOfArray; 
    int decimalNumCopied; 

    if (argc == 2) { 
     decimalNum = atoi(argv[1]); 
    } 
    if(argc == 1 || decimalNum < 0 || decimalNum > 255) { 
     printf("Please enter a number from 0 to 255: "); 
     scanf("%d", &decimalNum); 
     while (decimalNum < 0 || decimalNum > 255) { 
      printf("Program is expecting an int from 0 to 255 inclusive\n" 
       "Please enter a number from 0 to 255: "); 
      scanf("%d", &decimalNum); 
     } 
    } 
    decimalNumCopied = decimalNum; 

    while (decimalNum != 0) { 
     decimalNum /= 2; 
     i++; 
    } 
    sizeOfArray = i; 

    binaryNum = malloc(sizeOfArray * sizeof(int)); 

    i--; 
    while (decimalNumCopied != 0) { 
     binaryNum[i] = decimalNumCopied % 2; 
     decimalNumCopied /= 2; 
     i--; 
    } 

    for (i = 0; i < sizeOfArray; i++) { 
     printf("%d", binaryNum[i]); 
     if (binaryNum[i] == 0) { zeroCounter++; } 
    } 
    printf("\nThere are %d zeroes\n", zeroCounter); 

    free(binaryNum); 

    return 0; 
} 
+0

私はそれは不毛の質問だと思いますが、なぜmallocがこの場合、integer(変数binaryNumの型)として型キャストされるべきではないかを説明しますか? – libengazi

+0

上記の質問に答える必要はありません - 私はこのトピックを読んでいます: http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc?noredirect=1&lq=1 – libengazi

関連する問題