【问题标题】:Segfault - where is my mistake?Segfault - 我的错误在哪里?
【发布时间】:2014-04-19 15:18:27
【问题描述】:

我在writeLogs 例程中遇到段错误。

(gdb) print *analyzers->analyzer2.log
Cannot access memory at address 0x80000007f5b4
(gdb) print analyzers->analyzer2.log
$13 = (int *) 0x80000007f5b4

所以,指针似乎存在,值,不存在。 我希望,我在调用的每个例程中都有相同的指针和相同的值。见 附上代码:

typedef struct analyzer_t
{     
  int *log;
}analyzer_t;


typedef struct analyzers_t
{
  analyzer_t analyzer2;
}analyzers_t;



int MarketTalkMessagesVerarbeiten(unsigned char *datap, size_t size, GTree* t, analyzers_t *analyzers)
{
    *analyzers->analyzer2.log++;
}
int writeLogs(char *name, analyzers_t *analyzers)
{
   printf("Anal: %d\n", *analyzers->analyzer2.log );  
}
gboolean main_loop(mainloop_param_t *data)
{
   analyzers_t *analyzers = data->analyzers;
   MarketTalkMessagesVerarbeiten(pUncompressStreamData, sizeBMB, t, analyzers);
   writeLogs(namelist[i]->d_name,  analyzers);
}
int main()
{
  int log_a2                = 0;
  analyzers_t analyzers;
  analyzers.analyzer2.log   = &log_a2;
  mainloop_param_t mlparams;
  mlparams.analyzers = &analyzers;
  GMainLoop* loop = g_main_loop_new (NULL, FALSE);

  g_timeout_add (5000, (GSourceFunc)main_loop, &mlparams);
  g_main_loop_run (loop);

}

【问题讨论】:

标签: c segmentation-fault glib


【解决方案1】:

++ 绑定比* 更紧密。

所以

  *analyzers->analyzer2.log++;
  1. 增量...log(一个指针!)
  2. 取消引用 1 的结果(这很可能指向无效的内存,因此取消引用它会调用未定义的行为并由此观察到崩溃)

要增加...log 指向的位置,请执行以下操作:

(*analyzers->analyzer2.log)++;

即:

  1. 取消引用analyzers->analyzer2.log
  2. 增加第 1 步指向的内容

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多