2017-05-22 11 views
-4

私は、配列内の重複を見つけてそれらを印刷するコードを作成しようとしていました。私はこのコードと、なぜCallocが使われているのか理解できず、intの主要部分が私には分かりません。コードを理解できません

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

void printRepeating(int arr[], int size) 
{ 
    int *count = (int *)calloc(sizeof(int), (size - 2)); 
    int i; 

    printf(" Repeating elements are "); 
    for(i = 0; i < size; i++) 
    { 
    if(count[arr[i]] == 1) 
     printf(" %d ", arr[i]); 
    else 
    count[arr[i]]++; 
    }  
}  

int main() 
{ 
    int arr[] = {4, 2, 4, 5, 2, 3, 1}; 
    int arr_size = sizeof(arr)/sizeof(arr[0]); 
    printRepeating(arr, arr_size); 
    getchar(); 
    return 0; 
} 
+1

あなたが理解していないコードを書きましたか? :-) –

+2

^^^それと....何malloc? – ThingyWotsit

+0

'calloc'呼び出しでcountパラメータとして' size-2'の代わりにmax(arr)を使う方が安全でしょう。言ってるだけ'。 – nucleon

答えて

1

このコードは本当に間違っています。

int *count = (int *)calloc(sizeof(int), (size - 2)); 

同様に:

はあなたにいくつかのヒントを与えるために、この行は配列を作成します

int count[size - 2] // If size was a constant 

不幸な問題は「関数は決してあなたので、動的に作成された配列を配置していないということですメモリリークが発生します。

行は、arr[i]の値がsize-2より大きい場合、ソフトウェアは割り当てられていないメモリに書き込みます。それが行われるべき方法を示すために

// No value should exceed 50 
#define MAX_ARR 50 

void printRepeating(int arr[], int size) 
{ 
    int found[MAX_ARR]; 
    int i; 

    // Set found variable to 0 
    memset(found, 0, sizeof(found)); 

    for(i = 0; i < size; i++) 
    { 
     // Did we find the same number before? 
     if (found[arr[i]] == 1) { 
      // Yes, print it 
      printf(" %d ", arr[i]); 
     } else { 
      // No, mark is as found 
      found[arr[i]] = 1; 
     } 
    } 
} 
+0

私はそれを理解できないのも不思議ではありません。何が起こっているのかを理解することは非常に悪いことでした。( – ThingyWotsit

2

callocを使用する理由は、サイズがあらかじめわかっていないためです。 VLAを使用する代わりに、著者が推奨するダイナミックメモリ割り当てを使用する方法もあります。著者のように悪いの種類は、メモリを忘れたfree。したがって、このコードはメモリをリークします。

さらに、入力にいくつかの特定のルールに依存するため、コードは非常にエラーが発生しやすい(たとえば、入力値がsize-2より大きいなど)。だから私のアドバイスは、このコードを離れてすべてを始めることです。

BTW:コードでmallocの代わりにcallocが使用され、メモリゼロが初期化されます。 mainに関して

....この行:

int arr_size = sizeof(arr)/sizeof(arr[0]); 

は、配列の要素数を算出します。

sizeof(arr) is likely to return 28 

sizeof(arr[0]) is likely to return 4 

ので

28/4 = 7 which is the number of array elements. 
4

それは例えば、保持するためにいくつかの条件に依存しているようなコードは、実際には "危険" であります配列の最大整数値がsize-2より大きくないことを確認してください。たとえば、入力がint arr[] = { 114, 112, 114, 5, 2, 3, 1}の場合、arr[0]114、コードcount[arr[0]]++printRepeatingに割り当てられた配列の境界を5要素だけ超えています。

私はコードを書き留めて自分で書きます。ほとんどあなたの経験に関係なく、あなたのコードは、提案されたコードよりも悪くない可能性が高いです:-)

1

実際に我々がvoidの型のポインタを返す指定されたサイズの単一のブロックを割り当てるためのmalloc()を使用しています。つまり、どのタイプのタイプにも割り当てることができます。形式は:malloc()calloc()ptr = (cast - type*) malloc(byte-size)

1つの非常に有意な差がある: malloc()ガベージ(またはランダム)を有する記憶空間の単一のブロックを割り当てている間の値、ストレージのcalloc()割り当てる割り当て複数のブロック、同じ大きさの各すべてのバイトをゼロに設定します。

+0

'calloc'は複数のブロックの記憶域を割り当てません。関数は引数 'size_t num'と' size_t size'の乗算を行います。 –

関連する問題