我关注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个字节。
答案 0 :(得分:7)
以下是mythreads [0] .context:
的副本ucontext_t c = mythreads[0].context;
在下面是指向mythreads [0] context
的指针ucontext_t* c = &(mythreads[0].context);
因此,代码的第一个代码是修改副本(它不会影响mythreads [0]上下文),第二个修改mythreads [0]上下文。
答案 1 :(得分: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;
但其中有两个额外的结构副本。