2016-04-26 83 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); 
} 

輸出是:明鏡WERT AUS線程3 IST: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; 
} 

雖然傳遞變量是這樣的:

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

聲明i全球,因爲裏面aufgabe_drei_thread()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); 
}