如何释放变量的内存,我在函数中返回

时间:2014-01-02 18:09:02

标签: c malloc fork

Helo,我有一个家庭作业,用C语言编写一个简单的shell,使用fork(),malloc()和execv(),我有以下问题: 我需要释放一个变量的内存,我正在函数中返回

char** parse_cmdline(const char* line){
    int size = strlen(line);
    char** array_of_strings = malloc((sizeof(char*)*(size)))
    char* pch = strtok(line," \n\t\r");
    int co = 0;
    int co2;
    while (pch != NULL)
    {
        array_of_strings[co]=(char*)malloc((sizeof(char)*strlen(pch))+1);
        strcpy(array_of_strings[co], pch);
        pch = strtok (NULL, " \n\t\r");
        ++co;
    }
    array_of_strings[co] = NULL;
    return array_of_strings; //that's the variable I need to free
}

这是整个计划

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>


char** parse_cmdline(const char* line){
    int size = strlen(line);
    char** array_of_strings = malloc((sizeof(char*)*(size)));
    char* pch = strtok(line," \n\t\r");
    int co = 0;
    int co2;
    while (pch != NULL)
    {
        array_of_strings[co]=(char*)malloc((sizeof(char)*strlen(pch))+1);
        strcpy(array_of_strings[co], pch);
        pch = strtok (NULL, " \n\t\r");
        ++co;
    }
    array_of_strings[co] = NULL;
    return array_of_strings;
}


int main(int argc, char *argv[]){
    char line[512];

    printf("Welcome to My shell!\n");
    while(1){
        printf(">$");
        gets(line);
        pid_t pid = fork();
        if (pid == -1){
            perror("");
        }else if(pid == 0){
            execvp(parse_cmdline(line)[0], parse_cmdline(line));
        }else{
            wait(pid);
        }
    }
    return 0;
}

请帮帮我

2 个答案:

答案 0 :(得分:1)

如果execvp()已成功,则无需释放缓冲区,因为execvp()会将进程内存映像替换为您要执行的映像。这意味着旧进程的内存映射被丢弃,从而释放任何已分配的缓冲区。

但如果execvp()失败,您将仍然处于当前流程中,并且您将可以释放缓冲区:

else if(pid == 0)
{
   char **cmdline = parse_cmdline(line);
   if (execvp(cmdline[0], cmdline)<0)
   {
     for (int i=0;*cmdline[i];i++)
       free(cmdline[i]);
     free(cmdline);
   }
}  

答案 1 :(得分:0)

好吧,如果你真的只想释放array_of_strings变量指向的缓冲区,只需将parse_cmdline的返回值存储在局部变量中,然后在完成处理后调用free()。​​

但是,你也为array_of_strings的每个索引分配字符串...所以除非你释放那些,否则它不够好。问题是main()不知道char *数组中有多少(char **)。因此,您可以使用NULL指针终止数组或以某种方式返回大小。然后,在释放数组之前,您将遍历数组并释放所有单个字符串。

此外,您希望在非学术环境中修复代码还有很多其他问题,但这可能超出了您的问题范围: - )