C 无法理解代码
我试图编写一个代码,在数组中查找重复项并打印它们。我不理解这段代码,也不明白为什么要使用Calloc,而int main部分对我来说并不清楚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
#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;
}
}
}