使用 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,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分配任何东西你只是在创建一个指向某处的指针 【参考方案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 时的运行时错误 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

google.colab 模块中是不是有关闭运行时的功能

保存时的核心数据问题[关闭]

并行运行 MEX 文件时的分段错误

使用向量将给定表达式转换为波兰符号时的运行时错误

在 C++ 中处理字符串时如何使用 memset? [关闭]

运行时的C ++构造函数变量值不会被覆盖[关闭]