1

我有以下内容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 字节的堆栈上下文。

4

2 回答 2

7

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

ucontext_t c = mythreads[0].context;

相反,以下是指向 mythreads[0] 上下文的指针

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

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

于 2013-03-05T06:20:49.973 回答
0

它们不是等价的。

第一个块对 in 的信息副本进行mythreads[0].context操作,第二个块对 in 的信息进行操作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;

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

于 2013-03-05T06:23:08.917 回答