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 

読みやすさの理由から。

ここで、次の2つのコードブロックが同等かどうか疑問に思いました。

  • ブロック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]コンテキストには影響しません)、2番目のコードはmythreads[0]コンテキストを変更します。

于 2013-03-05T06:20:49.973 に答える
0

それらは同等ではありません。

最初のブロックはの情報のコピーを操作しmythreads[0].context、2番目のブロックはの情報を操作し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;

しかし、その中には2つの追加の構造コピーがあります。

于 2013-03-05T06:23:08.917 に答える