Я не слишком много работаю с C, и базовый языковой нюанс просто отбросил меня назад, и я хотел бы лучше понять его, чтобы избежать его в будущем.
Я использую найденную реализацию очередипо следующей ссылке.
http://www.planet -source-code.com / vb / scripts / ShowCode.asp? txtCodeId = 9202 & lngWId = 3
Это довольно распространенное явлениеочередь, в которой значения помещаются и выталкиваются(FIFO) Но по какой-то причине последнее значение, которое я помещаю в очередь, устанавливает все значения в очереди с одинаковым значением.
Я начал со следующего кода.
Queue q;
queue_init(&q);
for (int i=0;i<10;i++) {
MyData *in_md;
in_md->mNumber = i;
queue_push(&q, in_md);
MyData *h = (MyData *)q.head->data;
MyData *t = (MyData *)q.tail->data;
NSLog(@"in_md: %i", in_md->mNumber);
NSLog(@"h->mNumber: %i", h->mNumber);
NSLog(@"t->mNumber: %i", t->mNumber);
if (q.head->link) {
MyData *l = (MyData *)q.head->link->data;
NSLog(@"l->mNumber: %i", l->mNumber);
}
}
НоЯ обнаружил, что когда я вытолкнул значения из числа, значение было 9 для каждого экземпляра.Я думал, что у меня есть какая-то ошибка указателя и пытался исправить это некоторое время.Я подумал, что, поскольку я объявил in_md внутри блока цикла for, это будет уникальный экземпляр с уникальным адресом памяти.В конце концов обновил код до следующего ...
Queue q;
queue_init(&q);
for (int i=0;i<10;i++) {
void *data = malloc(sizeof(MyData)); // key change
MyData *in_md = (MyData *)data;
in_md->mNumber = i;
queue_push(&q, data);
MyData *h = (MyData *)q.head->data;
MyData *t = (MyData *)q.tail->data;
NSLog(@"in_md: %i", in_md->mNumber);
NSLog(@"h->mNumber: %i", h->mNumber);
NSLog(@"t->mNumber: %i", t->mNumber);
if (q.head->link) {
MyData *l = (MyData *)q.head->link->data;
NSLog(@"l->mNumber: %i", l->mNumber);
}
}
Теперь мы гарантируем, что новый экземпляр создан, потому что используется malloc, и я приведу его к переменной, я могу установить значение int.Это создает вывод, как я ожидаю.
Я предполагаю, что именно так должен работать C, но я этого не ожидал.Обычно в других языках, таких как Java, C # и даже JavaScript, объявление переменной в блоке создает новый экземпляр переменной, чего я и ожидал.Но это не тот случай.
Что происходит в этом случае?