Я пытаюсь сохранить malloc'd ptr в глобальном ptr, поэтому я могу использовать его в другой функции. В идеале я бы стал более разумной структурой данных по всему миру, но пока я просто пытаюсь заставить глобальный ptr работать.Указатели структуры typedef, правильно указывающие на typedef struct (C)
В моем файле 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);
}
Вызов создать(), а затем начать() в основных распечатывает:
newThread is at: 0x7ffdf085c5e0, headThread is at: 0x601890
newThread is at: 0x7ffdf085c5d8, headThread is at: 0x601890
проявляющиеся во всех мои данные в newThread функции start() будут сдвинуты.
Я также попытался следующие:
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
Кто-нибудь знает, что именно я делаю неправильно в этом случае? Цените свою помощь!
'thread newThread = (thread) malloc (sizeof (thread))' не имеет смысла. Вы пытаетесь выделить struct, а не указатель, поэтому 'sizeof (thread)' is wrong. Лучше: 'thread newThread = malloc (sizeof * newThread);' Best: не скрывать указатели за typedefs. – melpomene
Спасибо, я работаю над файлом заголовка, который предоставляется мне для многопоточного назначения. Я расскажу об этом своему профессору, почему он решил структурировать его таким образом. Ценю вашу помощь! –
Пожалуйста, не удаляйте контент со своих вопросов. Ваш вопрос остается, иначе ответы не имеют смысла. Старые изменения ваших вопросов все еще видны на сайте, просто скрыты от представления по умолчанию. Если вы случайно разместили конфиденциальные данные, вы можете удалить их, но сначала вам нужно ** отредактировать свой вопрос таким образом, чтобы существующие ответы по-прежнему имели смысл **, затем укажите свой вопрос и попросите стереть старые версии - но имейте в виду, что они уже были проиндексированы Google. Однако я не вижу ничего конфиденциального в вашем первоначальном вопросе. – Gilles