我的代码,当您输入"最近":
时会调用它char* runRecent() {
FILE *ffp;
ffp = fopen("bash.txt","r");
char line[MAXLINE];
int fileItCount = 0;
for (int i = 0 ; i < numLinesinFile ; i++) {
fgets(line, sizeof(line), ffp);
if (fileCounter - 2 < 0){
printf("No recent commands exist.\n");
exit(EXIT_FAILURE);
}
if (i == (numLinesinFile - 2) && i >= 0) {
printf("Previous command: %s\n",line);
char * lineRet = strdup(line);
printf("line ret: %s\n",lineRet); //output: correct, something along the lines of "ls" or "ls -a"
printf("line ret: %d\n",&lineRet); //output: 1528174960
return lineRet;
}
}
}
然后将lineRet传递给函数:
start(runRecent());
函数声明的位置如下:
void start(char inputBuf[]){
printf("input is %s\n",inputBuf); //prints the command "recent" instead of the previous command that was executed
}
为什么这会返回当前命令而不是前一个命令?
答案 0 :(得分:1)
您的代码有很多问题,
该函数并不总是返回一个值,如果函数永远不会到达return
语句,这可能导致未定义的行为。很清楚为什么这可能是原因所以我不会详细解释它。
您可以在函数末尾添加return NULL;
之类的默认返回,但是在将结果传递给NULL
之前,您必须先检查printf()
。
它还会在此处调用未定义的行为
printf("line ret: %d\n", &lineRet);
您观察到的行为的可能解释之一是未定义的行为,打印指针的正确方法是
printf("line ret: %p\n", (void *) &lineRet);
标准将其他任何内容视为未定义的行为。
不检查strdup()
是否未返回NULL
poitner,如果没有可用内存,则可能会发生这种情况。问题非常不太可能,但您必须检查是否希望您的程序在任何条件下都能正常工作。
不检查fopen()
是否未返回NULL
,例如当某个文件对当前用户不可读或根本不存在时,可能就是这种情况如果无法打开它的情况。
start(runRecent());
会自动导致内存泄漏,您不需要释放每一个malloc()
因为内存将在程序结束时自动释放。但是像这样的一些错误你会遇到严重的麻烦,特别是因为你没有检查strdup()
是否返回了非NULL
指针。
事实证明,编写一个能够占用所有系统可用内存的程序并不是那么难,只需几分钟就可以发生微小的内存泄漏。
注意:启用编译器警告,你们两个都不会问这类问题,只需通过简单的归纳就可以了解有关c语言的更多信息。