【问题标题】:structure in c whose members are also structuresc中的结构,其成员也是结构
【发布时间】:2013-03-05 06:12:15
【问题描述】:

我有关注structs:

typedef struct stack {
    void* ss_sp;
    size_t ss_size;
    // ...
} stack_t; 

typedef struct ucontext {
    ucontext_t* uc_link;
    stack_t uc_stack;
    // ...
} ucontext_t;

typedef struct mythread_type {
    ucontext_t context;
    int ID;
    int status;
} mythread_t; 

现在我有一个数组如下:

mythread_t mythreads[100];

我想避免使用

mythreads[0].context.uc_stack.ss_size 

出于可读性原因。

现在我想知道以下两个代码块是否等效:

  • 区块 1

    ucontext_t c=mythreads[0].context;
    getcontext(&c);
    c.uc_stack.ss_size=1024;
    c.uc_stack.ss_sp=malloc(1024);
    
  • 第 2 块

    ucontext_t* c=&(mythreads[0].context);
    getcontext(c);
    (c->uc_stack).ss_size=1024;
    (c->uc_stack).ss_sp=malloc(1024);
    

我想要的是 mythreads[0] 堆栈的上下文来分配 1024 个字节。

【问题讨论】:

  • 对不起,我累了,很快就回复了。这些是不等价的。
  • 我不明白你为什么不使用 mythreads[0].context.uc_stack.ss_size .....出于可读性的原因,它更好
  • @KinjalPatel 我刚刚发现由于某种原因 mythreads[0].context.uc_stack.ss_size 也给出了编译器错误。在 C99 中是否合法?
  • 它完全有效....错误是什么?

标签: c struct lvalue


【解决方案1】:

以下是mythreads[0].context的副本:

ucontext_t c = mythreads[0].context;

与下面相反的是指向 mythreads[0] 上下文的指针

ucontext_t* c = &(mythreads[0].context);

因此,第一次代码和平修改了副本(它不影响 mythreads[0] 上下文),第二次修改了 mythreads[0] 上下文。

【讨论】:

    【解决方案2】:

    它们不相等。

    第一个块对mythreads[0].context 中的信息的副本进行操作,第二个块对mythreads[0].context 中的信息进行操作。

    如果你写的话,你也许可以实现整体等价:

    ucontext_t c = mythreads[0].context;
    getcontext(&c);
    c.uc_stack.ss_size = 1024;
    c.uc_stack.ss_sp = malloc(1024);
    mthreads[0].context = c;
    

    但其中有两个额外的结构副本。

    【讨论】:

      猜你喜欢
      • 2021-08-25
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多