【问题标题】:Pointer not returning after function in CC中的函数后指针不返回
【发布时间】:2023-03-28 17:29:01
【问题描述】:

我必须在大学班完成一场比赛。这是跳棋游戏。

除了一件事之外,所有作品都按照我老师的指示进行了描述。我需要将历史记录保存在动态内存中(每次移动在 char 数组中都有 5 个字符,所以我使用 malloc 启动“historial”,然后使用大小为 5 + 1 的 calloc。还有“nuevhistorial”临时保存一个只移动,然后将其添加到“历史”中,在接下来的移动中重复使用“新历史”。

我有一个 char *historial,然后我调用 GuardarHistorial 函数。

GuardarHistorial(numjugadas, historial, nuevhistorial);

(numerojugadas 是完成的总步数)

我尝试使用 calloc 或 realloc。

我使用 calloc 增加的代码:

void GuardarHistorial (int *numjugadas, char *historial, char *nuevohistorial) {

int i, j;
char *temp;   

temp = (char *) calloc ((HIST*(*numjugadas) + 1), sizeof(char));

if (temp == NULL) {
    printf("No se ha podido reservar memoria.");
    exit(1);
}    

for (i=0; i<HIST*(*numjugadas-1); i++) {
    temp[i] = historial[i];

}

for (j=0; i < (*numjugadas) * HIST; i++, j++) {
    temp[i] = nuevohistorial[j];
}

historial = temp;    
 }

我第一次调用函数时,它保存到历史记录,但“历史记录”没有回到它被声明的函数,为什么?它是一个指针……

如果我使用 realloc 的代码是:

void GuardarHistorial (int *numjugadas, char *historial, char *nuevohistorial) { 

temp = (char *) realloc (historial, (HIST*(*numjugadas) + 1) * sizeof(char));

if (temp == NULL) {
    printf("No se ha podido reservar memoria");
    free(historial);
    exit(1);
}

historial = temp;

i=(*numjugadas-1) * HIST;

for (j=0; i < (*numjugadas) * HIST; i++, j++) {
    historial[i] = nuevohistorial[j];
}  
 }

在第二个示例中,它似乎可以工作,如果我使用终端或 Netbeans 打开它,则不会显示任何错误。但是用 Valgrind 测试它,在第二步,它完成了程序,在不同的内存地址有很多错误。

我该如何解决?

谢谢!

【问题讨论】:

  • 使函数 char *GuardarHistorial 并返回 temp。
  • 有人请为此找到一个规范的副本,这是一个非常常见的问题。我试过但失败了……

标签: c pointers dynamic memory-leaks dynamic-memory-allocation


【解决方案1】:

如答案@Ian Abbott historial 中所述,需要是 char ** 类型,而不是 char *,这意味着您需要传入指向指针的指针。例如,请参阅此 post 或此 post 以更好地了解其工作原理。

另一种可能是改变

void GuardarHistorial(int *numjugadas, char *historial, char *nuevohistorial)

char *GuardarHistorial(int *numjugadas, char *historial, char *nuevohistorial) {
  ....
  return temp;
}

然后调用它

historial = GuardarHistorial(numjugadas, historial, nuevohistorial);

此外,不需要将 numjugadas 作为指针传递,因为您不会在函数中修改它。

【讨论】:

  • 该函数调用无效。从原帖来看,我想你的意思是:historial = GuardarHistorial(numjugadas, historial, nuevohistorial)
  • 好的,谢谢!!更新为 char ** 在 realloc 之前运行并解决的一些函数。我也将 numjugadas 更改为 *numjugadas。感谢您的快速答复!
【解决方案2】:

如果你想通过historial参数将指针传回给调用者,它需要是char **类型,而不是char *

void GuardarHistorial (int *numjugadas, char **historial, char *nuevohistorial) {

    temp = (char *) realloc (*historial, (HIST*(*numjugadas) + 1) * sizeof(char));

    if (temp == NULL) {
        printf("No se ha podido reservar memoria");
        free(*historial);
        exit(1);
    }

    *historial = temp;

    i=(*numjugadas-1) * HIST;

    for (j=0; i < (*numjugadas) * HIST; i++, j++) {
        temp[i] = nuevohistorial[j];
    }  
}

函数调用需要更改以将指针传递给指针:

GuardarHistorial(numjugadas, &historial, nuevohistorial);

【讨论】:

  • 好的,谢谢!!更新为 char ** 在 realloc 之前运行并解决的一些函数。感谢您的快速答复!
猜你喜欢
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 2012-02-26
  • 2010-12-25
  • 2012-02-02
  • 2014-08-16
相关资源
最近更新 更多