структура в c, элементы которой также являются структурами

У меня есть следующие 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 байта.


person as3rdaccount    schedule 05.03.2013    source источник
comment
Извините, я устал и ответил быстро. Это не эквивалентно.   -  person Kyle Strand    schedule 05.03.2013
comment
я не понимаю, почему бы вам не использовать мифриды [0].context.uc_stack.ss_size ..... это даже лучше по соображениям удобочитаемости   -  person Kinjal Patel    schedule 05.03.2013
comment
@KinjalPatel Я только что узнал, что по какой-то причине мифриды [0].context.uc_stack.ss_size также выдает ошибку компилятора. Это законно в C99?   -  person as3rdaccount    schedule 05.03.2013
comment
это совершенно правильно .... в чем ошибка?   -  person Kinjal Patel    schedule 05.03.2013


Ответы (2)


Ниже приведена копия мифридс[0].контекст:

ucontext_t c = mythreads[0].context;

Напротив, следующий указатель на контекст myreads[0]

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

В результате первый участок кода модифицирует копию (не влияет на контекст myreads[0]), второй модифицирует контекст myreads[0].

person AnatolyS    schedule 05.03.2013

Они не эквивалентны.

Первый блок работает с копией информации в 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;

но в нем есть две дополнительные копии структуры.

person Jonathan Leffler    schedule 05.03.2013