C-功能指针一无所有 - 我如何避免这种情况



i当前具有typedef指针函数,该功能并未指向任何导致分割故障的任何内容(核心倾倒)。我试图想到一种解决方案以避免它,但到目前为止都无法想到。

我的代码:

typedef void (*MenuFunction)(System*);
int main(int argc, char ** argv)
{
    ...
    /* While loop for my menu */ 
    while(1)
    {
        printf("Main Menun");
        printf("%sn", menu[0].text);
        printf("%sn", menu[1].text);
        printf("%sn", menu[2].text);
        printf("Select your option (1-3): ");
        (*getMenuChoice(menu))(&system);
    }
}
/* Function that points to the menu function */
MenuFunction getMenuChoice(MenuItem * menu)
{
    MenuFunction function = NULL;
    char select[50];
    fgets(select, 50, stdin);
    if(select[strlen(select)-1] == 'n')
    {      
        switch(select[0])
        {
            case '1':
                function = menu[0].function;
                break;
            case '2':
                function = menu[1].function;
                break;
            case '3':    
                function = menu[2].function;
                exit(0);
                break;
            default:
                printf("Invalid optionn");
        }
    }
    else
    {
        readRestOfLine();
        printf("Error: buffer overflow. Please try again, entering less data");
    }
    return function;
}

编辑:

现在,我提出的解决方案是创建一个没有任何内容的函数,以便我可以指向某物的功能。我认为这不是理想的选择,但在短期内会做。

void skip()
{ }

管理所有指针(数据功能和功能指针)的一个很好的策略是:让它们始终指向有效的东西或无效。那就是:

  1. 当您声明指针变量时,请始终对其进行初始化,要么指向有效的东西,要么指向null。
  2. 使用指针之前,请确保其不是零。
  3. 当您执行任何使指针无效的事情时,请将其设置回null。

在您的情况下,您已经遵循规则1,当您初始化

MenuFunction function = NULL;

因此,如果选择无效,则您的getMenuChoice()函数将返回null。没错,这是一个常见的模式。

您需要做的是遵守规则2。现在您有

(*getMenuChoice(menu))(&system);

这有点嘴巴:您致电getMenuChoice(),然后立即调用它返回指针的功能。将其分为几行:

MenuFunction fp;
fp = getMenuChoice(menu);
if(fp == NULL)
    fprintf(stderr, "invalid choicen");
else
    (*fp)(&system);

在这里,我们在新变量fp中捕获getMenuChoice的返回值,并测试以确保在调用它之前它不是null。

[P.S。就您而言,您不必担心我的规则3。]

避免'此SEG故障事件:

在通过Typedef实例调用函数

的实例之前,检查typedef的实例是否包含除空之外的其他其他内容。

相关内容

  • 没有找到相关文章