【问题标题】:Run-time error when using memset [closed]使用 memset 时的运行时错误 [关闭]
【发布时间】: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,tcbstruct 的内存位置,'\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分配任何东西你只是在创建一个指向某处的指针

标签: c struct memset


【解决方案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);

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

【讨论】:

    最近更新 更多