malloc和分段错误

时间:2012-10-17 19:09:14

标签: c segmentation-fault

我的代码中有“分段错误”。如果我在函数中使用“malloc()”分配一些空间,我很好奇。功能完成后,空间是否仍然有效? 进一步的问题,当创建这样的子线程时,我认为即使在其父出口之后它也存在。我在Linux中使用GCC。

void foo(){
    void *child_stack;
    child_stack=(void*)malloc(16384);
    child_stack += 16384;
    clone((void*)do_function,child_stack,0,NULL);
}

3 个答案:

答案 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)

  1. 使用malloc创建的内存进入,直到使用free明确销毁它为止。这是使用malloc而不是在堆栈上创建变量的主要原因,当它们超出范围(例如,函数返回)并且销毁堆栈帧时会被销毁。段错误可能是因为你正在分配16384个字节,然后将指针向前移动16384与+ =(你为什么这样做?),然后将它传递给一个可能试图访问它的函数。

  2. 我不是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.