Ниже работает то, что они выделяют память - но неправильный размер.
myThread *node = (myThread *)malloc(sizeof(myThread *));// wrong size,s/b sizeof(myThread)
myThread *node = (myThread *)malloc(1); // wrong size
Почему это работает?
Когда код пытается сохранить данные в этот адрес, неправильный размер может стать или не стать очевидным. Это неопределенное поведение (UB).
C кодируется без обучающих колес . Когда код имеет UB, например, не выделяет достаточное количество памяти и не использует ее, он не должен давать сбой, он может потерпеть неудачу, сейчас или позже, или в следующий вторник.
myThread *node = (myThread *)malloc(1); // too small
node->timeSlice = 42; // undefined behavior
Какой правильный способ динамически выделить память для структуры? @ MM
Приведенный ниже код легко корректируется, просматривается и поддерживается.
p = malloc(sizeof *p); //no cast, no type involved.
// or
number_of_elements = 1;
p = malloc(sizeof *p * number_of_elements);
// Robust code does error checking looking for out-of-memory
if (p == NULL) {
Handle_error();
}
Нужно ли это приведение?
Нет. Должен ли я привести результат mallo c?
Как структура сохраняется в памяти?
Каждый элемент сопровождается потенциальным заполнением. Это зависит от реализации.
unsigned int
maybe some padding
char
maybe some padding
unsigned int
maybe some padding
sem_t
maybe some padding
Интересно, почему это работает, почему я могу заполнять и работать с полями структуры, для которой я выделил только один байт памяти.
OP ищет причину, по которой он работает.
Возможно, выделение памяти выполняется кусками по 64 байта или чем-то большим, чем sizeof *p
, поэтому выделение 1 имеет тот же эффект, что и sizeof *p
.
Возможно, более поздняя область памяти, теперь испорченная использованием кода скудным распределением, проявится позже.
Возможно, распределитель - злобный зверь, играющий с OP, только чтобы уничтожить жесткий диск следующим 1 апреля . (Нечестивый код часто использует UB для заражения систем - это не так уж надумано)
Все это UB. Все может случиться.