Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用memset时出现运行时错误_C_Struct_Memset - Fatal编程技术网

C 使用memset时出现运行时错误

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

我是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);
    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;