2015-10-17 2 views
0

Я пытаюсь сохранить 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 

Кто-нибудь знает, что именно я делаю неправильно в этом случае? Цените свою помощь!

+2

'thread newThread = (thread) malloc (sizeof (thread))' не имеет смысла. Вы пытаетесь выделить struct, а не указатель, поэтому 'sizeof (thread)' is wrong. Лучше: 'thread newThread = malloc (sizeof * newThread);' Best: не скрывать указатели за typedefs. – melpomene

+0

Спасибо, я работаю над файлом заголовка, который предоставляется мне для многопоточного назначения. Я расскажу об этом своему профессору, почему он решил структурировать его таким образом. Ценю вашу помощь! –

+0

Пожалуйста, не удаляйте контент со своих вопросов. Ваш вопрос остается, иначе ответы не имеют смысла. Старые изменения ваших вопросов все еще видны на сайте, просто скрыты от представления по умолчанию. Если вы случайно разместили конфиденциальные данные, вы можете удалить их, но сначала вам нужно ** отредактировать свой вопрос таким образом, чтобы существующие ответы по-прежнему имели смысл **, затем укажите свой вопрос и попросите стереть старые версии - но имейте в виду, что они уже были проиндексированы Google. Однако я не вижу ничего конфиденциального в вашем первоначальном вопросе. – Gilles

ответ

0

INT обе функции запуска() и создать() вы печатаете адрес:

глобальной переменной headThread которая & headThread = 0x601890 и остаются неизменными, поскольку его же каждый раз (глобальный)

, но переменная newThread объявляется локально (в стеке) каждой из двух функций.

newThread в start() не то, что в 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; 

наконец правильно таНос быть, так как это :

thread newThread = malloc(sizeof(threadinfo_st)); //better use calloc 
+0

С помощью newThread в функции запуска, в любое время, когда я пытаюсь получить доступ к любому из полей, я получаю ошибку переполнения стека. Как мне обойти это? –

+0

вы должны предоставить полный код. переполнение стека позволяет нам думать, что существует рекурсивная функция, которая генерирует ошибку. но только путем обеспечения полного кода, чтобы быть уверенным – milevyo

0

Как правильно указано, вы назначаете указатель на контекст (который вы называете потоком), а не сам контекст.

Затем в обоих случаях вы печатаете адреса, где хранятся эти указатели (а не сами указатели). Таким образом, для статического объекта (headThread) они одинаковы, для автоматического объекта (newThread, который выделяется в стеке каждый раз заново) они разные. Что здесь может быть проблемой?

Смежные вопросы