取消引用从线程原因返回的指针;分段错误:11 [重复]

Posted

技术标签:

【中文标题】取消引用从线程原因返回的指针;分段错误:11 [重复]【英文标题】:Dereferencing returned pointer from thread causes; Segmentation fault: 11 [duplicate] 【发布时间】:2016-10-14 09:53:09 【问题描述】:

我对 C++ 和指针编程非常陌生。我试图将一个参数传递给一个线程,向它添加一个参数,然后返回一个指向该结果的指针。主线程应该只打印返回指针指向的结果。

#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;

代码可以编译,但执行时出现分段错误。我的猜测是这与我正在做的演员阵容有关,但我不知道是什么。

任何帮助将不胜感激!

【问题讨论】:

您返回一个指向自动变量(位于该线程的堆栈上)的指针。因此,当线程函数退出时,该堆栈及其内容不再存在。由于您从 main 传递了一个指向 int 的指针,因此只需使用 _n 将结果存储在其中。 int 结果 = *n + 1; // local 变量的地址,因为如果函数返回,它将变得无效。 【参考方案1】:
i = &result;

您正在返回一个指向局部变量的指针。一旦超出范围,访问它就会产生未定义的行为。

【讨论】:

以上是关于取消引用从线程原因返回的指针;分段错误:11 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 sizeof 操作中取消引用空指针是不是有效[重复]

ctypes 不允许多次取消引用指针

什么是分段错误?

尝试从方法返回指向对象的指针时出现分段错误

为啥我的字符串分配会导致分段错误?

在 C++ 中使用指针的数组:访问返回的数组时出现分段错误