使用memset时出现运行时错误

时间:2014-10-14 20:21:51

标签: c struct memset

我是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,tcbstruct的内存位置,'\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);

}

2 个答案:

答案 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);

请注意,传入有效的地址(堆栈变量),而不是指向地址零的指针。