我的代码中有“分段错误”。如果我在函数中使用“malloc()”分配一些空间,我很好奇。功能完成后,空间是否仍然有效? 进一步的问题,当创建这样的子线程时,我认为即使在其父出口之后它也存在。我在Linux中使用GCC。
void foo(){
void *child_stack;
child_stack=(void*)malloc(16384);
child_stack += 16384;
clone((void*)do_function,child_stack,0,NULL);
}
答案 0 :(得分:2)
Stack和Heap之间的主要区别在于,当你从函数调用返回时,堆栈中的东西已经消失,但堆中的东西仍然存在。
例如,在以下函数中:
void test_func()
{
char a[20]; //using stack
char *b = malloc(20); //using heap
strcpy(a, "test string");
strcpy(b, "test string");
}
功能完成后,b仍指向字符串,但a完全消失。
对于第二个问题,除非使用thread_join
,否则子线程将不依赖于父线程。但是,主进程完成后,所有线程都将停止。
答案 1 :(得分:1)
要了解分段错误的原因,您可以尝试使用调试标志(-g
)编译代码并在memcheck tool of Valgrind内运行。
答案 2 :(得分:0)
使用malloc创建的内存进入堆,直到使用free明确销毁它为止。这是使用malloc而不是在堆栈上创建变量的主要原因,当它们超出范围(例如,函数返回)并且销毁堆栈帧时会被销毁。段错误可能是因为你正在分配16384个字节,然后将指针向前移动16384与+ =(你为什么这样做?),然后将它传递给一个可能试图访问它的函数。
我不是100%肯定,但是来自wait()手册页,
If a parent process terminates, then its "zombie" children (if any) are adopted by init(8), which automatically performs a wait to remove the zombies.