【问题标题】:malloc and segmentation faultmalloc 和分段错误
【发布时间】:2012-10-17 19:09:14
【问题描述】:

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

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

【问题讨论】:

  • 段错误发生在代码中的哪个位置? (您可以使用调试器(例如 gdb)解决此问题)仅使用 malloc 绝不会导致段错误,您必须在更早的时候破坏进程的内存。
  • 您将void * 转换为void *That makes no sense.
  • 进一步你在 void * 上做算术。
  • 这段代码甚至无法在 C 编译器上编译...
  • @YefimDinitz 谢谢。还在想办法。

标签: c segmentation-fault


【解决方案1】:

堆栈和堆之间的主要区别在于,当您从函数调用返回时,堆栈中的内容已经消失,但堆中的内容仍然存在。

例如,在以下函数中:

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,否则子线程不会依赖于父线程。但是,一旦主进程完成,所有线程都会停止。

【讨论】:

    【解决方案2】:

    要找出分段错误的原因,您可以尝试使用调试标志 (-g) 编译代码并在 memcheck tool of Valgrind 中运行它。

    【讨论】:

      【解决方案3】:
      1. 使用 malloc 创建的内存在 heap 上,在被 free 明确销毁之前一直可用。这就是使用 malloc 而不是在 stack 上创建变量的主要原因,这些变量会在超出范围时被销毁(例如,函数返回)并且堆栈帧被销毁。段错误可能是因为您分配了 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.
        

      【讨论】:

      • 如果我不释放它(因为我现在不知道该怎么做),它会导致“segfault”吗?
      • @melodrama,不。错误在别处。也许是因为 childstack + 16384 实际上 您分配的区域之外。
      • @Roddy,我认为堆栈向下增长。
      • @melodrama,malloc 返回一个指向它分配的内存开头的指针。它在堆上,而不是堆栈上,你不需要增加它就可以使用它(你所做的只是将指针移动到分配内存的错误端,然后写入它会出现段错误,因为您正在访问分配的 malloc 区域之外的内存)。
      • @melodrama,是的,但是 +16384 仍然在你 malloc 的范围之外。可以试试 +16380 吗?
      猜你喜欢
      • 1970-01-01
      • 2014-03-29
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      • 2015-01-29
      • 2011-02-13
      • 1970-01-01
      相关资源
      最近更新 更多