2013-03-05 202 views
1

我具有以下structs结构在C,其成员也结构

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); 
    

我想要什么是的背景堆栈分配1024个字节。

+0

对不起,我很累,很快就回答了。那些不相同。 – 2013-03-05 06:21:27

+0

我不明白你为什么不用mythreads [0] .context.uc_stack.ss_size .....其更好的可读性原因 – 2013-03-05 06:24:41

+0

@KinjalPatel我刚刚发现出于某种原因mythreads [0] .context.uc_stack。 ss_size也给编译器错误。在C99中合法吗? – as3rdaccount 2013-03-05 06:38:15

回答

7

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

ucontext_t c = mythreads[0].context; 

在相反下面是指针mythreads [0]上下文

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

结果代码的第一和平修改副本(它不影响mythreads [0]上下文),第二个修改mythreads [0]上下文。

0

它们不等价。

第一个块对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; 

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