我试图在全局ptr中保存malloc'd ptr,所以我可以在另一个函数中使用它。理想情况下,我会在全球范围内建立一个更智能的数据结构,但是现在我只是想让全局ptr工作。
在我的lwp.h文件中,我有以下定义:
typedef struct threadinfo_st *thread;
typedef struct threadinfo_st {
tid_t foo1
unsigned long foo2
size_t foo3
rfile foo4
thread foo5
thread foo6
thread foo7
thread foo8
} context;
使用这个线程结构,我的lwp.c文件中有两个函数。在第一个函数中,我构造了一个malloc'd线程,然后将数据复制到全局ptr。然后在第二个函数中,我尝试取消引用全局ptr以接收我最初创建的线程。为了确认我正确地这样做,我在每一步打印出ptr地址。不幸的是,我似乎无法重新获得原始地址,因此第二个函数中的所有数据都被移位
static thread headThread = NULL;
void create(){
thread newThread = (thread) malloc( sizeof(thread));
assert(newThread != NULL)
// Assign junk to newThread
printf("newThread is at: %p, headThread is at: %p\n", &newThread, &headThread);
headThread = newThread;
}
void start(){
thread newThread = headThread;
printf("newThread is at: %p, headThread is at: %p\n", &newThread, &headThread);
}
调用create()然后在main打印出start():
newThread is at: 0x7ffdf085c5e0, headThread is at: 0x601890
newThread is at: 0x7ffdf085c5d8, headThread is at: 0x601890
导致我的所有数据在start()函数的newThread中被移位。
我也尝试了以下内容:
static thread *headThread = NULL;
void create(){
thread newThread = (thread) malloc( sizeof(thread));
assert(newThread != NULL)
// Assign junk to newThread
printf("newThread is at: %p, headThread is at: %p\n", &newThread, &headThread);
headThread = &newThread;
}
void start(){
thread newThread = headThread;
printf("newThread is at: %p, headThread is at: %p\n", &newThread, &headThread);
}
打印出来:
newThread is at: 0x7ffff6294130, headThread is at: 0x601890
newThread is at: 0x7ffff6294128, headThread is at: 0x601890
在这种情况下,有谁知道我到底做错了什么? 感谢您的帮助!
答案 0 :(得分:0)
正如melpomene正确地指出你正在分配一个指向上下文的指针(你称之为线程),而不是上下文本身。
然后,在两个函数中,您将打印存储这些指针的地址(而不是指针本身)。因此,对于静态对象(headThread),它们是相同的,对于auto对象(newThread,每次重新分配在堆栈上)它们是不同的。 这里似乎有什么问题?
答案 1 :(得分:0)
int函数start()和create()都打印地址:
全局变量headThread,它是& headThread = 0x601890并且保持不变,因为它每次都是相同的(全局)
但变量newThread在本地(在堆栈中)声明为两个函数中的每一个。
start()中的newThread不是在create()中,它们在内存中有不同的地址(堆栈)0x7ffff6294130不是0x7ffff6294128。获取malloced ptr这样做:
printf("newThread is at: %p, headThread is at: %p\n", newThread, headThread);
那么这是正确的:
static thread headThread = NULL;
不是这个:
static thread *headThread = NULL;
最后将malloc改为:
thread newThread = malloc( sizeof(threadinfo_st)); //better use calloc