Редактировать: Вы полностью изменили вопрос, поэтому мой старый ответ больше не имеет смысла. Я постараюсь ответить на новый (старый ответ все еще ниже), но для справки, в следующий раз, пожалуйста, просто задайте новый вопрос вместо того, чтобы сменить старый.
stck
- это указатель, который вы указываете на ту же память, на которую указывает _stck
. Указатель не подразумевает выделение памяти, он просто указывает на память, которая (как мы надеемся) уже выделена. Когда вы делаете, например,
char* a = malloc(10); // Allocate memory and save the pointer in a.
char* b = a; // Just make b point to the same memory block too.
free(a); // Free the malloc'd memory block.
free(b); // Free the same memory block again.
вы освобождаете одну и ту же память дважды.
- старый ответ
В режиме push вы устанавливаете stck
так, чтобы он указывал на тот же блок памяти, что и _stck
, и в конце вызова вы освобождаете стек (таким образом вызывая free () для вашего общего стек один раз из каждого потока)
Удалите вызов free()
, и, по крайней мере для меня, он больше не будет падать. Распределение стека, вероятно, следует выполнить в main()
после объединения всех потоков.