C 无法理解代码

C 无法理解代码,c,arrays,C,Arrays,我试图编写一个代码,在数组中查找重复项并打印它们。我不理解这段代码,也不明白为什么要使用Calloc,而int main部分对我来说并不清楚 #include<stdio.h> #include<stdlib.h> void printRepeating(int arr[], int size) { int *count = (int *)calloc(sizeof(int), (size - 2)); int i; printf(" Repeating

我试图编写一个代码,在数组中查找重复项并打印它们。我不理解这段代码,也不明白为什么要使用Calloc,而int main部分对我来说并不清楚

#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;
}
使用calloc的原因是事先不知道大小。另一种选择是使用VLA,但显然作者更喜欢动态内存分配。有点糟糕,因为作者忘了释放内存。所以这个代码会泄漏内存

此外,代码非常容易出错,因为它依赖于输入的某些特定规则,例如,没有输入值大于size-2。所以我的建议是把这段代码通读一遍,从头开始

顺便说一句:代码使用calloc而不是malloc来初始化内存零

关于主要。。。。这一行:

int arr_size = sizeof(arr)/sizeof(arr[0]);
计算数组中的元素数

sizeof(arr) is likely to return 28

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


该代码实际上是危险的,因为它依赖于某些条件,例如数组中的最大整数值不大于size-2。因此,例如,如果您的输入是int arr[]={114,112,114,5,2,3,1},那么arr[0]将是114,并且代码计数[arr[0]++将超过printRepeating中分配的数组的界限,该界限仅为5个元素


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

此代码确实错误,您根本不应该使用它

为了给您一些提示,此行创建了一个数组:

int *count = (int *)calloc(sizeof(int), (size - 2));
类似于:

int count[size - 2] // If size was a constant
一个不幸的问题是,该函数从未处理动态创建的数组,因此您将看到内存泄漏

行计数[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;
        }
    }   
} 
实际上,我们使用malloc分配指定大小的单个块,该块返回void类型的指针。这意味着我们可以将其分配给任何类型。表格为: ptr=强制转换类型*mallocbyte大小

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

您编写了一个不懂的代码?:-^^^^还有。。。。什么malloc?在calloc调用中使用maxarr而不是size-2作为计数参数会更安全。只是说,还有calloc,但不是免费的。普罗利。在这个程序中没什么大不了的,但是……那么“大小-2”是怎么回事呢?难怪我不理解它——对我来说,弄清楚发生了什么太糟糕了:calloc不分配多个存储块。返回的指针指向一个连续的内存块,函数将为您执行参数size\t num和size\t size的乘法。
// 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;
        }
    }   
}