为什么我在这个特定的代码中分段
Why am I segfaulting in this specific code?
这个程序应该采用文件名和参数,并创建一个进程,在将结果输出到终端的同时执行代码(我不知道为什么这也不起作用(。
我发现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(
相关文章:
- 我是如何在这段代码中出现分段错误的
- 为什么代码给出分段错误?
- 输入较高值时的分段代码
- 分段故障 运行C++代码时出现 SIGSEGV
- 用于查找数组中最大元素的出现次数的代码,给出分段错误
- 在使用堆栈为下一个最大数字编写代码时面临 SIGSEGV(分段错误)
- qt C++命令行代码中的分段错误(核心转储)
- 为什么此代码中存在分段错误?
- 为什么我的代码包含错误分段错误(核心转储)?
- 为什么我的代码给我一个分段/核心转储错误?
- 有关矩阵的代码错误导致分段错误(内核转储)
- 分段错误:BST C++代码中的 11
- 运行我的代码时出现分段错误(核心转储)问题
- C++代码的分段错误(核心转储)
- C++ .我正在尝试通过使用开关内的数组来获取用户输入,但是当我运行代码时,它显示分段错误?
- 为什么我的c++代码显示分段错误
- 霍夫曼代码 - 分段错误 11.
- boost::asio Visual Studio 2013中的示例代码分段错误
- 如何将这些代码分段为标头、源文件和类
- 当我将一组命令移动到一个单独的函数中时,代码分段