我想创建一个程序来查找数组中的重复整数。 为此,我有两种方法。
我见过一个解决方案,但它只限于1位数字。它使用计数数组。
int *count = (int *)calloc(sizeof(int), (size - 2));
为什么(size -2
)?
代码是:
#include<stdio.h>
#include<stdlib.h>
void printDuplicate(int arr[], int size){
int *count = (int *)calloc(sizeof(int),(size-2));
int i;
for(i=0;i<size;i++){
if(count[arr[i]] == 1)
printf("%d,",arr[i]);
else
count[arr[i]]++;
}
}
int main(){
int arr[] = {2,5,3,4,2,5,7,8,7};
int size = sizeof(arr)/sizeof(arr[0]);
printDuplicate(arr,size);
return 0;
}
答案 0 :(得分:1)
实际上这里写的calloc
声明是错误的。这里的内存分配是
4*7=28
所以这里的内存分配是7
整数,但在这里你可以访问更多的7个元素。它在C
语言中实际上是错误的,但它现在可以正常运行,因为C
的{{1}}没有数组边界检查,但它可能会导致写入无效的内存。
但是你如何能够访问未分配的内存块?
以最佳方式解释此答案here。
您可以看到我编译的代码here。
当我们解码算法时,您可以看到
i=0
arr[0]=2
。然后它会检查count[2]==1
或count[2]
是否代表数字2
的重复次数。至于第一次count[2]=0
所以它将值增加到1
i
值。i=4
时,它会检查count[arr[4]]
是否为count[2]==1
。如果它是一个然后打印它。答案 1 :(得分:0)
以下评论显示calloc
功能
int *count =
(int *)
calloc(
sizeof(int), // Number of elements to allocate
(size-2) // Size of each element
);
我猜你的参数是颠倒的
如果你有:
int *count = (int *)calloc((size - 2), sizeof(int));
它会为int
数组分配size - 2
个元素,每个元素的大小为int
但我认为这些元素(size - 2
)对你的程序来说还不够。
查看您的示例(使用反向参数):
...
int arr[] = {2,5,3,4,2,5,7,8,7}; // This array has 9 elements
int size = sizeof(arr)/sizeof(arr[0]); // So size will 9
printDuplicate(arr,size); // arr and 9 as parameters
...
int *count = (int *)calloc((size-2), sizeof(int)); // You allocated a 7-size array
...
if(count[arr[i]] == 1) // Maximum index of count will be 8
// so the allocated memory will be not enough
...
答案 2 :(得分:0)
int *count = (int *)calloc((size - 2), sizeof(int));
size -2
不是必需的,这是混淆的声明,请避免使用它。
将内存创建为全部使用。我们可以使用数组的直接大小而不是size-2
。
它不会出错。谢谢。
享受学习本课程。