我是C的新手,我正在使用memset
。
从我读到的memset
用char替换部分内存的一部分。
当我尝试这样做时,我的程序关闭并使用断点,它在memset
行之后停止。不太清楚为什么。
void init_TCB (struct TCB_t *tcb, void *function, void *stackP, int stack_size)
{
memset(tcb, '\0', sizeof(struct TCB_t));
getcontext(&tcb->context);
tcb->context.uc_stack.ss_sp = stackP;
tcb->context.uc_stack.ss_size = (size_t)stack_size;
makecontext(&tcb->context, function, 0);
}
sizeof(struct TCB_t)
为957,tcb
是struct
的内存位置,'\0'
是char
。
这是结构`
struct TCB_t
{
struct TCB_t * next;
struct TCB_t * previous;
ucontext_t context;
};
这里是我初始化struct
的地方void start_thread(void (*function)(void))
{
struct stack * stackP = (struct stack*)malloc(sizeof(struct stack));
struct TCB_t * tcb = (struct TCB_t *)(sizeof(struct TCB_t));
init_TCB (tcb, function, stackP, 8192);
ptr = create_list();
add_to_list( ptr);
}
答案 0 :(得分:4)
这一行错了:
struct TCB_t * tcb = (struct TCB_t *)(sizeof(struct TCB_t));
你将tcb指向结构的大小。
相反,您可以使用malloc()
:
struct TCB_t * tcb = malloc(sizeof(struct TCB_t));
答案 1 :(得分:1)
似乎getcontext被定义为
int getcontext(ucontext_t *ucp);
函数getcontext()初始化ucp指向的结构 到当前活跃的背景。
http://man7.org/linux/man-pages/man3/getcontext.3.html
它需要一个指向ucontext_t
的指针,但是你传递所有的零(一个初始化为地址为零的指针)。
供参考,请参阅Wikipedia上的此实施,关键部分为
ucontext_t main_context1;
// ...
getcontext(&main_context1);
请注意,传入有效的地址(堆栈变量),而不是指向地址零的指针。