2016-04-26 10 views
1

スレッドの戻り値を使用しようとしています。そのために私はちょうど次の記事を見つけました: How to return a value from thread in CC pthread、ポインタが内容を失う

だから私は、次のコードを使用します。

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 

void *myThread() 
{ 
    int ret = 42; 
// printf("%d\n", ret); 
    printf("%p\n",(void*)&ret); 

    void * ptr = (void*)&ret; 
    printf("%p\n", ptr); 
    printf("%d\n", *((int *)ptr)); 
    return (void*) &ret; 
} 

int main() 
{ 
    pthread_t tid; 
    static void *status; 

// int ret = 42; 
// status = &ret; 
// printf("%d\n", *((int *)status)); 

    pthread_create(&tid, NULL, myThread, NULL); 
    pthread_join(tid, &status); 

    printf("%p\n",((int *)status)); 
    printf("%d\n", *((int *)status)); 
    return 0; 
} 

出力は、次のとおりです。 0x7f7ead136f04、 0x7f7ead136f04、 、 0x7f7ead136f04、

なぜ最後の値が42でないのですか?ここ

同じ問題:

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 

    void* aufgabe_drei_thread() { 
     int i = 5; 
     return &i; 
    } 

int main(int argc, char** argv) { 
    int* ptr_wert_aus_drei; 
    pthread_t thread_three_id; 
    pthread_create(&thread_three_id, NULL, aufgabe_drei_thread, NULL); 
    pthread_join (thread_three_id, &ptr_wert_aus_drei); 
    printf("Der Wert aus Thread 3 ist: %d\n", *((int *)ptr_wert_aus_drei)); 

    return (EXIT_SUCCESS); 
} 

出力です:デアワートAUSスレッド3イスト:32508 ない5.

私は間違って何をしているのですか?

+4

ローカル変数へのポインタを返すことはできません。関数が終了すると、ローカル変数は破棄されます。 – Havenard

答えて

2

ヒープを割り当てて値にハングアップさせるか、ポインタを渡して格納します。

この:

void *myThread(void *opaque) 
{ 
    int *ret = malloc(sizeof(int)); 
    *ret = 42; 
// printf("%d\n", *ret); 
    printf("%p\n",(void*) ret); 

    void * ptr = (void*) ret; 
    printf("%p\n", ptr); 
    printf("%d\n", *((int *)ptr)); 
    return (void*) ret; 
} 

またはこの:

void *myThread(void *opaque) 
{ 
    int *ret = (int *) opaque; 
    *ret = 42; 
// printf("%d\n", *ret); 
    printf("%p\n",(void*) ret); 

    void * ptr = (void*) ret; 
    printf("%p\n", ptr); 
    printf("%d\n", *((int *)ptr)); 
    return NULL; 
} 

次のように変数を渡しながら次の場合内部aufgabe_drei_thread()iが破壊されるので

pthread_create(&tid, NULL, myThread, &status); 
pthread_join(tid, NULL); 
2

がグローバルとしてiを宣言関数が終了します。

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 

int i = 0; 

void* aufgabe_drei_thread() { 
    i = 42;  
    return &i; 
} 

int main(int argc, char** argv) { 
    int* ptr_wert_aus_drei; 
    pthread_t thread_three_id; 
    pthread_create(&thread_three_id, NULL, aufgabe_drei_thread, NULL); 
    pthread_join (thread_three_id, &ptr_wert_aus_drei); 
    printf("Der Wert aus Thread 3 ist: %d\n", *((int *)ptr_wert_aus_drei)); 

    return (EXIT_SUCCESS); 
} 

または

void* aufgabe_drei_thread() {  
    return (void*) 42; 
} 

int main(int argc, char** argv) { 
    int* ptr_wert_aus_drei; 
    pthread_t thread_three_id; 
    pthread_create(&thread_three_id, NULL, aufgabe_drei_thread, NULL); 
    pthread_join (thread_three_id, &ptr_wert_aus_drei); 
    printf("Der Wert aus Thread 3 ist: %d\n", *((int *)ptr_wert_aus_drei)); 

    return (EXIT_SUCCESS); 
} 
関連する問題