从函数返回char指针的问题

时间:2015-09-20 02:00:34

标签: c arrays pointers char

我的代码,当您输入"最近":

时会调用它
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
 }

为什么这会返回当前命令而不是前一个命令?

1 个答案:

答案 0 :(得分:1)

您的代码有很多问题,

  1. 该函数并不总是返回一个值,如果函数永远不会到达return语句,这可能导致未定义的行为。很清楚为什么这可能是原因所以我不会详细解释它。

    您可以在函数末尾添加return NULL;之类的默认返回,但是在将结果传递给NULL之前,您必须先检查printf()

  2. 它还会在此处调用未定义的行为

    printf("line ret: %d\n", &lineRet);
    

    您观察到的行为的可能解释之一是未定义的行为,打印指针的正确方法是

    printf("line ret: %p\n", (void *) &lineRet);
    

    标准将其他任何内容视为未定义的行为。

  3. 不检查strdup()是否未返回NULL poitner,如果没有可用内存,则可能会发生这种情况。问题非常不太可能,但您必须检查是否希望您的程序在任何条件下都能正常工作。

  4. 不检查fopen()是否未返回NULL,例如当某个文件对当前用户不可读或根本不存在时,可能就是这种情况如果无法打开它的情况。

  5. start(runRecent());会自动导致内存泄漏,您不需要释放每一个malloc()因为内存将在程序结束时自动释放。但是像这样的一些错误你会遇到严重的麻烦,特别是因为你没有检查strdup()是否返回了非NULL指针。

    事实证明,编写一个能够占用所有系统可用内存的程序并不是那么难,只需几分钟就可以发生微小的内存泄漏。

  6. 注意:启用编译器警告,你们两个都不会问这类问题,只需通过简单的归纳就可以了解有关c语言的更多信息。