Мне нужно разобрать этот код JSON. В структуре есть ключ, val и указатель на следующую структуру. Из-за вложенности указатель val иногда указывает на структуру jss.
Код ниже
struct jss {
uint8_t type;
char *key;
char *val;
struct jss *next;
};
void my_f() {
...
struct jss *js = (struct jss *)malloc(sizeof(struct jss));
...
while(js) {
struct jss *js1 = (struct jss *)js->val;
...
}
}
компилируется и работает нормально и имеет следующую сборку:
struct jss *js = (struct jss *)malloc(sizeof(struct jss));
4ea: bf 20 00 00 00 mov $0x20,%edi
4ef: e8 00 00 00 00 callq 4f4 <Init+0x407>
4f4: 48 89 45 e8 mov %rax,-0x18(%rbp)
...
char *t, *f, *h;
struct jss *js1 = ((struct jss *)(js->val));
522: 48 8b 45 e8 mov -0x18(%rbp),%rax
526: 48 8b 40 10 mov 0x10(%rax),%rax
52a: 48 89 45 b0 mov %rax,-0x50(%rbp)
Мы посмотрите, что rbp-0x18, имеющий структуру addr js, перемещается в rax, rax затем добавляет 0x10, чтобы указать на адрес js -> val, и результат сохраняется в rbp-0x50, который содержит js1. Пока все хорошо!
Но если я изменю код на этот (js1 заменяется на js):
struct jss {
uint8_t type;
char *key;
char *val;
struct jss *next;
};
void my_f() {
...
struct jss *js = (struct jss *)malloc(sizeof(struct jss));
...
while(js) {
char *t, *f, *h;
struct jss *js = (struct jss *)js->val;
...
}
}
У меня есть эта сборка:
struct jss *js = (struct jss *)malloc(sizeof(struct jss));
4ea: bf 20 00 00 00 mov $0x20,%edi
4ef: e8 00 00 00 00 callq 4f4 <Init+0x407>
4f4: 48 89 45 e8 mov %rax,-0x18(%rbp)
...
char *t, *f, *h;
struct jss *js = ((struct jss *)(js->val));
522: 48 8b 45 c8 mov -0x38(%rbp),%rax
526: 48 8b 40 10 mov 0x10(%rax),%rax
52a: 48 89 45 c8 mov %rax,-0x38(%rbp)
Что компилируется нормально, но с ошибками: вместо загрузки адреса структуры js (rbp-0x18) в rax загруженный адрес - это адрес новой структуры, которую я создаю ... тогда нет ничего удивительного в том, почему происходит сбой.
Вопрос в том, что не так во втором коде. Я знаю о переменном затенении, и это действительно мое намерение. Почему компилятор запутался (я использую g cc)?