gpt4 book ai didi

c - 对象在 C 中返回后返回垃圾值

转载 作者:太空宇宙 更新时间:2023-11-04 06:33:01 24 4
gpt4 key购买 nike

我正在尝试创建一个线程库。 MyThreadCreate 返回类型为 MyThread 的对象。例如:

struct MyThread
{
ucontext_t Context;
ThreadStatus Status;
int ThreadId;
};

typedef struct MyThread MyThread;

void * MyThreadCreate(void(*start_funct)(void *), void *args)
{
MyThread temp;
char *stack;
stack = (char *)malloc(8192*sizeof(char));
ucontext_t tempContext;
if (getcontext(&tempContext) == -1)
temp->ThreadId = 0;
tempContext.uc_stack.ss_sp = stack;
tempContext.uc_stack.ss_size = 8192*sizeof(char);
tempContext.uc_link = NULL;
makecontext(&tempContext,(void(*)(void))start_funct,1, args);
temp->Context = tempContext;
temp->Status = READY;
temp->ParentThread = currentThread;
temp->ThreadId = NEW_THREAD_ID++;
return temp;
}

在我的 client.c 中,我调用如下。

MyThread T;
T = (MyThread)MyThreadCreate(t0, (void *)n2);
MyThreadJoin(T);

在 MyThreadJoin 中,当我检查 T 的 threadId 值时,我得到一个随机值。

void MyThreadJoin(MyThread thread); //defintion for MyThreadJoin

更新部分:当我尝试返回名为 MyThread 的对象时,我在调用 MyThreadCreate 后立即收到段错误。另外,请注意,我包括了一个包含以下定义的头文件(我不能更改它)。typedef void *MyThread因此,只有当我为 MyThreadCreate 返回 void * 而不是 MyThread.但是即使代码工作正常,在这种情况下我也无法获得 threadId。谁能告诉我哪里出错了。

当我试图将 MyTHreadCreate 的返回值保留为 MyThread 时,它会抛出段错误。所以我把它变成了 void * 并且我能够获取对象然后使用它来调用 MyThreadJoin,但是我得到了 MyThreadId 的垃圾值。我缺少什么。

最佳答案

问题归结为:

void * MyThreadCreate(...)
{
MyThread temp;
// manipulate temp
return temp;
}

外部代码只期望堆栈上有一个 void *,因此只有 temp 的第一个 sizeof(void *) 字节被保留。尝试访问超出此范围的任何内容,您将在堆栈中获得随机垃圾。

相反,您的函数应该像这样返回 MyThread:

MyThread MyThreadCreate(...)
{
MyThread temp;
// manipulate temp
return temp;
}

或者,如果您必须返回一个 void * 来与其他代码交互,那么您必须在堆上分配返回值:

void * MyThreadCreate(...)
{
MyThread *temp = malloc(sizeof(MyThread));
// manipulate temp
return temp;
}

但这是等待发生的内存泄漏,所以如果可能的话,我会按值返回结构。

关于c - 对象在 C 中返回后返回垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18661924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com