C 没有指针的分段错误?

C 没有指针的分段错误?,c,pointers,runtime-error,C,Pointers,Runtime Error,这是我的代码和问题。代码编译得很好。但当我运行它时。当我进入getMenuOption Segmentation中的菜单选项后,会弹出错误提示。怎么了? 我对编程基本上是新手。如果有,谢谢你的帮助 #include <stdio.h> #include<math.h> #define CALCULATE_PI 'a' #define CALCULATE_GEOMEAN 'b' #define CALCULATE_HARMMEAN 'c' void printInstr

这是我的代码和问题。代码编译得很好。但当我运行它时。当我进入getMenuOption Segmentation中的菜单选项后,会弹出错误提示。怎么了? 我对编程基本上是新手。如果有,谢谢你的帮助

#include <stdio.h>
#include<math.h>

#define CALCULATE_PI 'a'
#define CALCULATE_GEOMEAN 'b'
#define CALCULATE_HARMMEAN 'c'

void printInstructions (void);
void printMenuOptions (void);
int  runMenuOption ();
int  getMenuOption ();
int  getLimit ();
int  calculatePi ();
int  calculateGeoMean ();
int  calculateHarmonicMean ();

int main(void)
{
    printInstructions();

    printMenuOptions();

    runMenuOption(getMenuOption());

    return 0;

}

void printInstructions (void)
{
    printf("======================================================\n");
    printf("=  PI, Geometric Mean, and Harmonic Mean Calculator  =\n");
    printf("=  Please refer to the menu to choose calucaltion    =\n");
    printf("=Choose desired menu option and press enter to begin =\n");
    printf("=      Proceed to follow on-screen instructions      =\n");
    printf("======================================================\n\n\n");

    return;
}

void printMenuOptions (void)
{
    printf("3 choices: Please enter a VALID letter.\n");
    printf("Choice 'a'   = Calcualtes PI\n");
    printf("Choice 'b'   = Calculates Geometric Mean\n");
    printf("Choice 'c'   = Calculates Harmonic Mean\n\n");

    return;
 }

int runMenuOption (int getMenuOption())
{
    char option;
    double answer,
            Pi = 0.0,
            geoMean = 0.0;

    option = getMenuOption();

    switch (option)
    {
        case CALCULATE_PI:
            calculatePi(getLimit());
            answer = Pi;
            break;
        case CALCULATE_GEOMEAN:
            calculateGeoMean(getLimit());
            answer = geoMean;
        case CALCULATE_HARMMEAN:
            printf("Harmonic Mean");
            break;
        default:
            printf("Incorrect Character!\n");
            printf("Try again");
            break;
    }

    printf("Your answer is %5p", &answer);

    return 0;
}

int getMenuOption (void)
{
    char option;

    printf("Please enter choice: ");

    scanf("%c", &option);

    return option;
}

int getLimit ()
{
    int limit;

    scanf("%d", &limit);

    return limit;
}

int calculatePi (void)
{
    int limit,
    count = 0,
    Pi = 0;

    printf("Please enter the PI limit: ");

    limit = getLimit();

    for (count = 1; count <= limit; count++)
    {
        Pi += 1 / count;
    }

    return sqrt(Pi * 6);
}

 int calculateGeoMean()
 {
    int limit,
        userValue = 0,
        count = 0;
    double geoMean = 0;

    limit = getLimit();

    while(count <= limit)
    {
       if (userValue <= 0)
           printf("Incorrect. Try again");
       else
       {
           count++;
           userValue *= userValue;
       }

    }
    geoMean = userValue;

    return sqrt(userValue);
}

int calculateHarmonicMean()
{
    int limit,
        userValue = 0,
        count = 0;
     double harmMean = 0;

     limit = getLimit();

    while(count <= limit)
    {
        if (userValue <= 0)
            printf("Incorrect. Try again");
        else
        {
            count++;
            userValue *= 1 / userValue;
        }

    }
    harmMean = userValue;

    return limit / userValue;
}

这个函数定义是完全错误的

int runMenuOption (int getMenuOption())
您可以这样传递getMenuOption的返回值

int runMenuOption (int option)


您不应该将任何值传递给此函数并在runMenuOption内调用getMenuOption。这两种方法都不正确。

此函数定义完全错误

int runMenuOption (int getMenuOption())
int runMenuOption (int getMenuOption())
您可以这样传递getMenuOption的返回值

int runMenuOption (int option)

您不应该将任何值传递给此函数并在runMenuOption内调用getMenuOption。你两者都在做,这是不正确的

int runMenuOption (int getMenuOption())
这是你的问题

这应该是:

int runMenuOption (int opt)
另外,您不应该在runMenuOption中调用getMenuOption,因为您在将getMenuOption作为参数传递给runMenuOption时调用它。runMenuOption应该只有一个switch语句

这是你的问题

这应该是:

int runMenuOption (int opt)

另外,您不应该在runMenuOption中调用getMenuOption,因为您在将getMenuOption作为参数传递给runMenuOption时调用它。runMenuOption应该只有一个switch语句。

您需要将函数的定义从int runMenuOption int getMenuOption修改为int runMenuOption int option。在调用中,将调用getMenuOption,并将输出放入被调用函数的堆栈框架中。

您需要将函数的定义从int-runMenuOption int-getMenuOption修改为int-runMenuOption int-option。在调用中,将调用getMenuOption,并将输出放在被调用函数的堆栈框架中。

根据您对runMenuOption函数的声明,它使用指向返回整数的函数的指针作为其第一个参数:

int runMenuOption (int getMenuOption())
runMenuOption(getMenuOption);
然后在此行中调用该函数:

option = getMenuOption();
runMenuOption(getMenuOption());
这很好。然而,问题在于这一行:

option = getMenuOption();
runMenuOption(getMenuOption());
这里调用getMenuOption函数,并将返回值传递给runMenuOption函数。但您应该做的是将函数本身作为参数传递:

int runMenuOption (int getMenuOption())
runMenuOption(getMenuOption);

出现分段错误的原因是,getMenuOption函数的返回值被视为函数指针,而您的程序正试图在该地址调用函数,这当然是无效的。

根据您对runMenuOption函数的声明,它将指向返回整数的函数的指针作为其第一个参数:

int runMenuOption (int getMenuOption())
runMenuOption(getMenuOption);
然后在此行中调用该函数:

option = getMenuOption();
runMenuOption(getMenuOption());
这很好。然而,问题在于这一行:

option = getMenuOption();
runMenuOption(getMenuOption());
这里调用getMenuOption函数,并将返回值传递给runMenuOption函数。但您应该做的是将函数本身作为参数传递:

int runMenuOption (int getMenuOption())
runMenuOption(getMenuOption);

出现分段错误的原因是,getMenuOption函数的返回值被视为函数指针,而您的程序正试图在该地址调用函数,这当然是无效的。

@Armin:我刚刚测试了我的解决方案,它在GCC v4.5.3上运行良好。Doing:runMenuOption&getMenuOption也会工作,但绝对不是runMenuOptiongetMenuOption。你能详细解释一下为什么你认为这是错误的吗?编辑:另请注意,作者:runMenuOptiongetMenuOption;我指的是他在主函数中调用runMenuOption的那一行,而不是runMenuOption函数原型。你的建议是,我有不同的想法,虽然不寻常,但有效。在您编辑之前,我无法撤消投票。我只是想告诉作者分段错误的确切原因。此解决方案还有一个优点,即只需对作者的原始程序进行最小的更改。@Armin:我刚刚测试了我的解决方案,它在GCC v4.5.3上运行良好。Doing:runMenuOption&getMenuOption也会工作,但绝对不是runMenuOptiongetMenuOption。你能详细解释一下为什么你认为这是错误的吗?编辑:另请注意,作者:runMenuOptiongetMenuOption;我指的是他在主函数中调用runMenuOption的那一行,而不是runMenuOption函数原型。你的建议是,我有不同的想法,虽然不寻常,但有效。在您编辑之前,我无法撤消投票。我只是想告诉作者分段错误的确切原因。此解决方案还具有对作者的原始程序进行最小更改的优点。