繁体   English   中英

指针在C中的函数后不返回

[英]Pointer not returning after function in C

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

除一件事外,所有描述我老师的工作都被描述了。 我需要将历史记录保存在动态内存中(每个移动在char数组中有5个字符,因此我使用malloc来启动“ historial”,然后使用大小为5 + 1的calloc。还有“ nuevohistorial”来临时保存一个)仅移动,然后将其添加到“ historial”,然后将“ nuevohistorial”重新用于下一个动作。

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

GuardarHistorial(numjugadas,historial,nuevohistorial);

(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];
}  
 }

在第二个示例中,它似乎可以正常工作,如果我用Terminal或Netbeans打开它,则不会显示任何错误并且。 但是在第二步中使用Valgrind对其进行测试时,它会在不同内存地址中出现很多错误的情况下完成程序。

我该如何解决?

谢谢!

如答案中所述,@ Ian Abbott历史记录的类型必须为char **,而不是char *,这意味着您需要将指针传递给指针。 例如,请参阅这篇文章或这篇文章,以更好地了解其工作原理。

另一种可能性是改变

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参数将指针传递回调用方,则该指针的类型必须为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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM