使用 void 函数计算 C 中数组中出现频率最高的整数

Using a void function to calculate most frequent integer in an array in C

你好!我正在尝试创建一个程序(学校作业),要求用户输入 0 - 1000 之间的整数序列。当用户输入负整数或超过 100 个整数时,序列停止。

实际输入、保存和创建一个 "counter" 数组,其中包含输入整数的次数。但是,分配的一部分是创建一个 void 函数,该函数使用指向 return 哪个整数出现次数最多以及出现次数的指针变量。

#include <stdio.h>
#include <stdlib.h>

#define MAX_SEQ 100

void analyzeFrequencies(int mainArray[], int counter[], int* mOI, int* numOfOccurences);

int main()
{
    int i=0, *mOI=0, *numOfOccurences=0, tempNum=0, mainArray[MAX_SEQ] = {0}, counter[MAX_SEQ] = {0};

    printf("Please enter a integer between 0-1000.\nSequence will stop when you enter negative integer of after MAX_SEQ integers.\n\n");

    do
    {
        if( scanf("%d", &tempNum) == 1)
        {
            if (tempNum <= 1000)
            {
                if (tempNum < 0)
                {
                    printf("You decided to exit the sequence. Your array entered is:\n");
                }
                else
                {
                    mainArray[i] = tempNum;
                    counter[tempNum]++;
                    ++i;
                }
            }
            else
                printf("Please enter a number between 0-1000. Exit sequence by entering negative number.\n");
        }
        else
            printf("\nError.\n");

    } while(tempNum > 0 && i < MAX_SEQ);

    analyzeFrequencies(mainArray, counter, mOI, numOfOccurences); //This is where the problem occurs.

    if (i == 0)
    {
        printf("You entered no sequence.");
    }
    else
    {
        printf("\nSequence:\n");
        for(int j=0; j<i; j++)
        {
            printf("[%d] %d\n", j, mainArray[j]);
        }

        printf("Most occurred item: %d\nOccurred %d times!", *mOI, *numOfOccurences);
    }
return 0;
}

当我 运行 我的代码时,一切正常,直到我执行 analyzeFrequencies() 函数。然后程序停止工作。

void analyzeFrequencies(int mainArray[], int counter[], int* mOI, int* numOfOccurences)
{
    for(int i=0; i<MAX_SEQ; i++)
    {
        if(counter[i] > *numOfOccurences)
        {
            *mOI = i;
            *numOfOccurences = counter[i];
        }
    }
}

我期望函数 "void analyzeFrequencies" 到 return 通过 "mOI" 和 "numOfOccurences" 的指针变量值。 mOI 是出现次数最多的整数。

相反,程序只是停止工作。我查看我的代码有一段时间了,但似乎无法找到导致此问题的原因。我可能坐着看我的代码太久了,然后就瞎了。会感谢任何帮助,以了解我要去哪里错了!

P.S!我意识到代码根本没有优化,我很乐意收到任何反馈,但我的首要任务是让 analyzeFrequencies 函数开始工作!

int i=0, *mOI=0, *numOfOccurences=0, tempNum=0, 
    mainArray[MAX_SEQ] = {0}, counter[MAX_SEQ] = {0};

在您的 main 函数中,您将 mOInumOfOccurences 声明为指针变量,它们都被初始化为 0,这意味着它们是 NULL 指针。然后将这些 NULL 指针传递给您的函数并取消引用它们。取消引用 NULL 指针会调用 undefined behavior.

将这两个变量声明为 int 而不是 int * 并将它们的 地址 传递给 analyzeFrequencies.

所以这样声明它们:

int i=0, mOI=0, numOfOccurences=0, tempNum=0, 
    mainArray[MAX_SEQ] = {0}, counter[MAX_SEQ] = {0};

然后像这样调用你的函数:

analyzeFrequencies(mainArray, counter, &mOI, &numOfOccurences)