это двойная кольцевая связь. dev_num, blk_num и статус по моему вопросу не выдаются.
typedef struct buf_node {
unsigned dev_num;
unsigned blk_num;
unsigned status:2;
struct buf_node *ptr_prev_free_q;
struct buf_node *ptr_next_free_q;
} stc_buf_header;
это буферный узел, который содержит идентификатор buf_header и поле данных
typedef struct {
stc_buf_header *buf_header;
stc_mm *data_area;
} stc_buffer;
это двойная кольцевая ссылка, которая содержит свободный буферный узел, ожидающий использования (например, UNIX)
typedef struct free_lk_node {
stc_buffer *lk_header;
unsigned len;
} stc_free_lk;
И, теперь я определяю функцию для инициализации ссылки двойного цикла
int init(stc_buffer *lk_header, unsigned dev_num, unsigned blk_num){
printf("buf_header\t%p\n", lk_header->buf_header);
printf("lk_header\t%p\n", lk_header);
printf("dev_num\t%d\n", lk_header->buf_header->dev_num);
printf("blk_num\t%d\n", lk_header->buf_header->blk_num);
lk_header->buf_header->dev_num = dev_num;
lk_header->buf_header->blk_num = blk_num;
lk_header->buf_header->status = 0x0;
lk_header->buf_header->ptr_next_free_q = lk_header->buf_header;
lk_header->buf_header->ptr_prev_free_q = lk_header->buf_header;
lk_header->data_area->data = -1; // means that this node is header of the link
}
оператор printf() использовался для отладки, когда я получил эту ошибку.
Хорошо, теперь, если я напишу так в main()
int main(){
stc_free_lk *link = (stc_free_lk*)malloc(sizeof(stc_free_lk));
init(link->lk_header, (unsigned)0, (unsigned)0);
return 0;
}
когда он доходит до точки оператора printf(), возникает ошибка Segment Fualt
Однако, если я напишу так в main()
int main(){
stc_free_lk link;
init(link.lk_header, (unsigned)0, (unsigned)0);
return 0;
}
ВСЕ ОК. ЗАЧЕМ?? меня это смущает...(-o-)#
это на самом деле не в порядке даже во втором случае, это только КАЖЕТСЯ в порядке из-за стека. Попробуйте скомпилировать второй экземпляр с параметром -O2 и посмотрите, не вылетит ли он (вероятно, вылетит).