无法理解代码

时间:2017-05-22 19:04:12

标签: c arrays

我试图创建一个代码来查找数组中的重复项并打印它们。我无法理解这段代码以及为何使用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;
}

4 个答案:

答案 0 :(得分:4)

代码实际上是“危险的”,因为它依赖于某些条件来保持,例如数组中的最大整数值不大于size-2。因此,如果您的输入是int arr[] = { 114, 112, 114, 5, 2, 3, 1},那么arr[0]将是114,代码count[arr[0]]++将超过{{1}中分配的数组的范围这只是5个元素。

我把代码扔掉然后写下你自己的代码;几乎不管您的经验如何,您的代码可能不会比建议的更差: - )

答案 1 :(得分:2)

使用calloc的原因是预先不知道大小。另一种方法是使用VLA,但显然作者更喜欢动态内存分配。有点不好,因为作者忘记了free记忆。所以这段代码会泄漏内存。

此外,代码非常容易出错,因为它依赖于输入的某些特定规则(例如,没有输入值大于size-2)。所以我的建议是通过这个代码离开并重新开始。

BTW:代码使用calloc代替malloc来初始化内存零。

关于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.

答案 2 :(得分:1)

这段代码确实是错的,你根本就不应该使用它。

为了给你一些提示,这一行创建了一个数组:

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

类似于:

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

一个不幸的问题是该函数从不处理动态创建的数组,因此您将看到内存泄漏。

count[arr[i]]++是一个灾难:如果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;
        }
    }   
} 

答案 3 :(得分:1)

实际上,我们使用malloc( )来分配指定大小的单个块,该块返回void类型的指针。这意味着我们可以将它分配给任何类型的类型。表格是:     ptr = ( cast - type*) malloc(byte-size)

malloc()calloc()的一个非常重要的区别是: 虽然malloc()使用垃圾(或随机)值分配单个存储空间块,但calloc()分配分配多个存储块,每个存储块大小相同,然后将所有字节设置为零。