使用 memset 时的运行时错误 [关闭]
Posted
技术标签:
【中文标题】使用 memset 时的运行时错误 [关闭]【英文标题】:Run-time error when using memset [closed] 【发布时间】:2014-10-14 20:21:50 【问题描述】:我是 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_t)
是 957,tcb
是 struct
的内存位置,'\0'
是 char
。
这是结构`
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
。
这一切都取决于函数被调用时tcb
指向什么。
memset
看起来不错,根据您提供的少量信息,除非指针值 tcb
并没有真正指向正确分配的 struct TCB_t
(您没有显示分配,很难说)。您还没有展示如何定义 TCB_t
,因此对 getcontext(&tcb->context);
的调用可能存在问题。
getcontext 是对 ucontext_t 库的内部调用
你没有为tcb
分配任何东西你只是在创建一个指向某处的指针
【参考方案1】:
这一行是错误的:
struct TCB_t * tcb = (struct TCB_t *)(sizeof(struct TCB_t));
您将 tcb 指向结构的大小。
相反,您可以使用malloc()
为结构分配空间:
struct TCB_t * tcb = malloc(sizeof(struct TCB_t));
【讨论】:
对memset(tcb, '\0', sizeof(struct TCB_t));
的调用不会仍然覆盖指向malloc分配的内存的指针吗?
@EricJ.:不。它使用指针来确定写入位置。它不会覆盖指针。从memset
文档中可以清楚地看到这一点。 (您如何建议以不同的方式编写该行?回想一下,C 没有引用!)
哦,我明白了。声明是ucontext_t context;
我以为是ucontext_t *context;
。【参考方案2】:
好像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);
请注意,传入的是(堆栈变量的)有效地址,而不是指向地址零的指针。
【讨论】:
以上是关于使用 memset 时的运行时错误 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章