为什么我在这个特定的代码中分段

Why am I segfaulting in this specific code?

本文关键字:代码 分段 为什么      更新时间:2023-10-16

这个程序应该采用文件名和参数,并创建一个进程,在将结果输出到终端的同时执行代码(我不知道为什么这也不起作用(。

我发现seg错误来自于我试图释放字符串的argvNew数组

#include <iostream>
using namespace std;
#include <unistd.h>
#include <sys/wait.h>

main(int argc, char **argv){
    int pid;
    int i;
    char *argvNew[argc-1];
    do{
        //Check for failure
        if ((pid = fork()) < 0) {
            cerr << "Fork errorn";
            exit(1);
        }
        //Check if parent
        else if (pid == 0) {
            /* child process */
            //Add arguments to new array
            for(i = 0; i < argc-2; i++){
                argvNew[i] = argv[i+1];
            }
            argvNew[argc-2] = NULL;
            if (execvp(argv[1], argvNew) < 0) {
                cerr << "Execve errorn";
                exit(1);
            }
        }
        else {
            /* parent */
            waitpid(pid, NULL, 0);/* wait for the child to finish */
            //Free argvNew 
            for(i = 0; i < argc-1;i++){
                free(argvNew[i]);
            }
            free(argvNew);
        }
        //if we're need to create a new list of args in the future put it here
    }while(!argc);
}

测试输入:./myProgram /bin/ls -l

argvNew自动分配的,这意味着当它超出范围时,它所拥有的资源会自动释放。您只需要free动态分配数组:

char a[50]; // the [50] means automatic allocation
// ...
// no need to free

char* a = malloc(50); // dynamic allocation
// ...
// need to free later, or memory leak
free(a);
for(i = 0; i < argc-1;i++){
    free(argvNew[i]);
}
//This next call is identical to free(argvNew[0]), probably where you're 
//segfaulting, since you're freeing something twice
free(argvNew);

请注意,您不需要调用free((,因为argvNew[]包含的指针不指向新的malloc’ed数据,而是指向argv数组的值,这些值由父进程管理,不应由显式free(