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;
}
请帮帮我
答案 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指针终止数组或以某种方式返回大小。然后,在释放数组之前,您将遍历数组并释放所有单个字符串。
此外,您希望在非学术环境中修复代码还有很多其他问题,但这可能超出了您的问题范围: - )