【问题标题】:struct timespec in struct结构中的结构时间规范
【发布时间】:2014-09-12 20:48:27
【问题描述】:

以下是重现该问题的一个最小示例。对我来说,代码看起来很无辜。我怀疑struct timespc 背后有一些魔力;但是,我找不到任何可以解释它崩溃的原因。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>

typedef struct _task
{
    int id;
    int deadline;
    struct timespec processed_at;
    int process_time;
} task;

int main(int argc, char *argv[])
{
    task *t = malloc(sizeof t);
    t->process_time = 3;
    free(t);
    return 0;
}

【问题讨论】:

  • 因为您只为指针分配了足够的空间。
  • 不要将答案编辑到您的问题中,这会使第一次阅读问题的人感到困惑。相反,请接受已发布的答案之一。如果没有发布好的答案但您已经解决了问题,您可以编写自己的答案并接受它。
  • @MattMcNabb 感谢您的提示。完成。

标签: c struct timespec


【解决方案1】:

所有现有答案和 cmets 都指出了错误所在的关键部分。但是,sizeof 的某些用法不正确,所以我正在回答这个问题。

我漫不经心地看着这个SO,并假设OP 提供了正确的语法。既然他/她在谈论为什么要使用样式,我希望两者都是正确的。

至于是带()还是不带(),根据cppreference,type需要(),unary-expression不需要。因此,sizeof task 不正确(我在 clang 和 gcc 上遇到错误);相反,它应该是sizeof(task)sizeof *t

task *t = malloc(sizeof *t); // right
task *t = malloc(sizeof(task)); // right
task *t = malloc(sizeof task); // wrong both on gcc and clang
task *t = malloc(sizeof t); // syntactically right, but it's not what you want

【讨论】:

  • 在我看来,第一种形式也是最可取的,因为它避免了重复,因此可以在更改行首指定的类型名称时幸存下来,这在更复杂的场景(如数组)中更为显着分配/重新分配。作为副作用,它避免了对括号的需要。
  • @OliverCharlesworth 很惊讶你没有抱怨数字 2 是错误的,而 3 是正确的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多