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

时间:2015-12-11 10:09:05

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

我必须完成大学课程。这是棋盘游戏。

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

我有一个char * historyial然后我调用了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];
}  
 }

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

我该如何解决?

谢谢!

2 个答案:

答案 0 :(得分:2)

正如答案中所述@Ian Abbott历史需要是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作为指针传递,因为您不需要在函数中修改它。

答案 1 :(得分:1)

如果您想通过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);