C中的函数后指针不返回
Pointer not returning after function in C
我必须以大学身份完成一场比赛 class。这是跳棋游戏。
除一件事外,所有作品都按照我老师的指示进行了描述。我需要在动态内存中保存历史(每次移动在char数组中有5个字符,所以我使用malloc开始"historial"然后我使用大小为5 + 1的calloc。还有"nuevohistorial"暂时只保存一个动作,然后将其添加到 "historial",为下一个动作重新使用 "nuevohistorial"。
我有一个 char *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;
}
我第一次调用函数时,它保存到历史,但"historial"没有返回到它声明的函数,为什么?它是一个指针...
如果我使用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 测试它,在第二步,它完成了程序,但在不同的内存地址有很多错误。
我该如何解决?
谢谢!
如果要通过 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);
如@Ian Abbott historial 的回答中所述,需要是char **类型,而不是char *,这意味着你需要传入一个指向指针的指针。例如,请参阅此 post or this 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 作为指针传递,因为您不会在函数中修改它。
我必须以大学身份完成一场比赛 class。这是跳棋游戏。
除一件事外,所有作品都按照我老师的指示进行了描述。我需要在动态内存中保存历史(每次移动在char数组中有5个字符,所以我使用malloc开始"historial"然后我使用大小为5 + 1的calloc。还有"nuevohistorial"暂时只保存一个动作,然后将其添加到 "historial",为下一个动作重新使用 "nuevohistorial"。
我有一个 char *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;
}
我第一次调用函数时,它保存到历史,但"historial"没有返回到它声明的函数,为什么?它是一个指针...
如果我使用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 测试它,在第二步,它完成了程序,但在不同的内存地址有很多错误。
我该如何解决?
谢谢!
如果要通过 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);
如@Ian Abbott historial 的回答中所述,需要是char **类型,而不是char *,这意味着你需要传入一个指向指针的指针。例如,请参阅此 post or this 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 作为指针传递,因为您不会在函数中修改它。