C 使用memset时出现运行时错误
我是C新手,正在使用C 使用memset时出现运行时错误,c,struct,memset,C,Struct,Memset,我是C新手,正在使用memset。 从我读到的memset用字符替换内存部分。 当我尝试这样做时,我的程序会关闭并使用断点,它会在带有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
memset
。
从我读到的memset
用字符替换内存部分。
当我尝试这样做时,我的程序会关闭并使用断点,它会在带有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\u t)
是957,TCB
是struct
的内存位置,'\0'
是字符
这是结构图`
struct TCB_t
{
struct TCB_t * next;
struct TCB_t * previous;
ucontext_t context;
};
这里是我初始化结构的地方
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);
}getcontext似乎被定义为
int getcontext(ucontext_t *ucp);
函数getcontext()初始化ucp指向的结构
指向当前活动的上下文
它需要一个指向ucontext\u t
的指针,但您正在传递所有零(初始化为地址零的指针)
有关参考信息,请参见上的此实现,其中的关键部分如下所示
ucontext_t main_context1;
// ...
getcontext(&main_context1);
请注意,传入的是(堆栈变量的)有效地址,而不是指向地址零的指针。getcontext似乎定义为
int getcontext(ucontext_t *ucp);
函数getcontext()初始化ucp指向的结构
指向当前活动的上下文
它需要一个指向ucontext\u t
的指针,但您正在传递所有零(初始化为地址零的指针)
有关参考信息,请参见上的此实现,其中的关键部分如下所示
ucontext_t main_context1;
// ...
getcontext(&main_context1);
请注意,传入的是(堆栈变量的)有效地址,而不是指向地址零的指针。此行错误:
struct TCB_t*TCB=(struct TCB_t*)(sizeof(struct TCB_t))代码>
您将tcb指向结构的大小
相反,您可以使用malloc()
为结构分配空间:
struct TCB\u t*TCB=malloc(sizeof(struct TCB\u t))代码>此行错误:
struct TCB_t*TCB=(struct TCB_t*)(sizeof(struct TCB_t))代码>
您将tcb指向结构的大小
相反,您可以使用malloc()
为结构分配空间:
struct TCB\u t*TCB=malloc(sizeof(struct TCB\u t))
向我们展示getcontext
。这一切都取决于调用函数时tcb
指向什么。除非指针值tcb
没有真正指向正确分配的结构tcb\t
(您没有显示分配,很难说)。您也没有显示如何定义TCB\u t
,因此调用getcontext(&TCB->context);
可能存在问题。getcontext是对ucontext库的内部调用。您没有为tcb
分配任何内容。您只是创建一个指向某个位置的指针,向我们显示getcontext
。这完全取决于调用函数时tcb
指向的内容。memset
根据您提供的信息很少,除非指针值tcb
实际上没有指向正确分配的struct tcb\u t
(您没有显示分配,很难说)。您也没有显示如何定义tcb\u t
,因此调用getcontext(&tcb->context);
可能存在问题。getcontext是对ucontext库的内部调用您没有为tcb
分配任何内容,您只是创建了一个指向某个位置的指针,而对memset(tcb,'\0',sizeof(struct tcb\t))的调用则不会
仍然覆盖指向malloc分配的内存的指针吗?@EricJ.:否。它使用指针来确定写入的位置。它不会在指针上写入。这在memset
文档中非常清楚。(您建议如何以不同方式写入该行?回想一下,C没有引用!)哦,我明白了。声明是ucontext\u t context;
我想它是ucontext\u t*context;
。调用memset(tcb,'\0',sizeof(struct tcb\u t))
仍然覆盖指向malloc分配的内存的指针吗?@EricJ.:否。它使用指针来确定写入的位置。它不会在指针上写入。这在memset
文档中非常清楚。(您建议如何以不同方式写入该行?回想一下,C没有引用!)哦,我明白了。声明是ucontext\u t context;
我想它是ucontext\u t*context;
。