2016-10-14 24 views
0

我對C++和指針編程非常陌生。我試圖給一個線程傳遞一個參數,給它添加一個參數,然後返回一個指向這個結果的指針。主線程應該只打印返回指針指向的結果。取消引用線程原因返回的指針;分割錯誤:11

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

using namespace std; 

void* calculator(void* _n) { 
    int* n = (int*) _n; 
    int* i; 
    int result = *n + 1; 
    i = &result; 

    return i; 
} 

int main(){ 
    int input; 
    pthread_t calcThread; 
    void* exitStatus; 
    int* threadResult; 

    cout << "Input integer: " << endl; 
    cin >> input; 
    cout << "Init thread..." << endl; 

    pthread_create(&calcThread, NULL, calculator, &input); 
    pthread_join(calcThread, &exitStatus); 

    // Error around here? 
    threadResult = (int*) exitStatus; 
    cout << "Returned: " << *threadResult << endl; 
} 

代碼編譯,但執行時出現分段錯誤。我的猜測是,它與我正在做的演員有關,但我無法弄清楚什麼。

任何幫助將不勝感激!

+1

您返回一個指向自動變量(位於該線程的堆棧中)的指針。因此,當線程函數退出時,該堆棧及其內容不再存在。由於你從main傳入一個指向int的指針,只需使用'_n''來存儲結果即可。 – BitTickler

+0

int result = * n + 1; // <-result是本地的! 您不能返回** local **變量的地址,因爲如果函數返回它將變爲無效。 – Aaron

回答

2
i = &result; 

你正在返回一個指向局部變量的指針。只要它超出範圍,訪問它就會產生未定義的行爲。