【问题标题】:Why is pointer set to NULL in the next loop iteration? [duplicate]为什么在下一次循环迭代中指针设置为 NULL? [复制]
【发布时间】:2020-10-04 16:41:00
【问题描述】:

我有这种计算器,用天文数字运算,这是菜单的代码片段。 我需要完成的是将main 中声明的result 指针传递或初始化给菜单内的函数。

问题是,如果我初始化它,例如,在函数realizarSuma() 中,在while 循环的每次迭代之后,它会再次设置为NULL,所以我永远不能在另一个操作中使用那个result稍后。

int main() {
    NumeroAstronomico *result = NULL;
    int opcion;
    int finaliza = 0;

    while (finaliza == 0) {
        printf("1.Sumar valores\n2.Verificar igualdad de dos numeros\n3.Verificar menor valor\n"
               "4.Guardar resultados\n5.Cargar resultados\n6.Salir\n\n");
        printf("Opcion:");
        scanf("%d", &opcion);
        finaliza = menu(opcion, result);
    }

    return 0;
}

int menu(int opcion, NumeroAstronomico *result) {

    switch (opcion) {
        case 1:
            result = realizarSuma();
            printf("result %s\n", result->entero); //I get the correct result
            return 0;
        case 2:
            verificarIgualdad();
            return 0;
        case 3:
            obtenerMenor(result);
            return 0;
        case 4:
            printf("result %s\n", result->entero);
            guardarResultado(result);
            return 0;
        case 5:
            result = cargarResultado();
            return 0;
        case 6:
            exit(0);
        default:
            printf("Opcion Invalida, ingrese nuevamente\n");
            return 0;
    }
}

为什么会发生这种情况,我该如何避免这种行为?

【问题讨论】:

  • menu 中的变量resultmainresult副本。它不是同一个变量,即使名称相同。在menu 中更改resultmain 中的result 没有影响。您要么需要从menu 返回result,要么需要在menu 中将result 声明为指向指针的指针(NumeroAstronomico **result),然后传递地址 i> of result 到函数,例如menu(opcion, &result)
  • 将其称为副本真的公平吗?答案可能与另一个问题的答案相同,但 OP 没有问“如何修改传递给函数的指针?”他根本不知道他需要将指针传递给指针。他需要帮助找出他做错了什么。
  • @shrewmouse 是的,这正是发生的事情。当我在问自己的问题之前搜索答案时,我不知道许多已经回答的问题会解决我的问题

标签: c pointers


【解决方案1】:

所以这是你想要一个指向指针(即双指针)的时候。

int menu(int opcion, NumeroAstronomico **result) {

    switch (opcion) {
        case 1:
            result = &realizarSuma();
            printf("result %s\n", (*result)->entero); //I get the correct result
            return 0;
        default:
            printf("Opcion Invalida, ingrese nuevamente\n");
            return 0;
    }
}

因为你真正想做的是修改指针。

【讨论】:

  • result 将在为案例 1 调用菜单后悬空...
  • 在函数realizarSuma() 之前放置& 会引发警告“无法获取类型右值的地址”,因此我尝试将其转换为result = (NumeroAstronomico**) realizarSuma();。但即使这样做,我也会收到另一个警告“该值从未使用过”,并且在下一次迭代中,result 是 NULL
猜你喜欢
  • 2014-05-08
  • 1970-01-01
  • 2020-11-14
  • 2014-11-25
  • 2017-10-13
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多