我试图创建一个代码来查找数组中的重复项并打印它们。我无法理解这段代码以及为何使用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;
}
答案 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()
分配分配多个存储块,每个存储块大小相同,然后将所有字节设置为零。