【问题标题】:debugging segmentation fault using threads使用线程调试分段错误
【发布时间】:2016-03-23 08:07:29
【问题描述】:

在调试我的 c 程序时,我收到此错误消息

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff77f6700 (LWP 14945)]
__strcpy_sse2_unaligned ()
at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:532
532 ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S: Aucun fichier ou dossier de ce type.

我认为发布我的代码是“无用的”,因为它没有精确地显示错误行。

但我知道我认为它来自这个函数:

void add_user(tlistU *lu, user * u,tuser *new)
{

      tuser *nouveau = malloc(sizeof(tuser));

      u =malloc(sizeof(*u));        
      if (lu == NULL || nouveau == NULL)
      {
        exit(EXIT_FAILURE);
      }
   strcpy(nouveau->users->nickname,u->nickname);
   nouveau->next=lu->first;
   lu->first=nouveau;
}

(昵称是一个 9 字符的字符串)

【问题讨论】:

  • nouveau->users 未分配且未设置。 user *u 和 malloc(siezof(*u)) 不一致。

标签: c multithreading segmentation-fault


【解决方案1】:

你的代码有点奇怪。然而,崩溃的原因可能是这样的:

strcpy(nouveau->users->nickname,u->nickname);

请注意,nouveau 是您刚刚请求的一块未初始化内存。然后您将访问nouveau->users->nickname,它假定nouveau->users 是一个有效的指针。

正在发生的另一件事是在此处覆盖u

u = malloc(sizeof(*u));

我怀疑你实际上的意图是这样的:

nouveau->users = malloc(sizeof(*u));

这将解决这两个问题。

【讨论】:

  • 我应该写 tuser *nouveau = NULL 还是不初始化?
  • 两者都不... nouveau 仍然必须分配。
猜你喜欢
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 2015-09-15
  • 2013-12-25
相关资源
最近更新 更多