启动线程导致指针初始化时出现分段错误

Posted

技术标签:

【中文标题】启动线程导致指针初始化时出现分段错误【英文标题】:Launching threads cause segmentation fault on pointer initialization 【发布时间】:2019-07-19 13:34:59 【问题描述】:

为什么只有在启动两个“空”线程时,这段代码才会导致*y = 20 出现分段错误?

int main(int argc, char **argv) 

    int x = 10;
    int *y;
    *y = 20;

    std::thread t1([]);
    std::thread t2([]);

    t1.join();
    t2.join();

    return 0;

【问题讨论】:

你没有初始化 y ,所以你试图在一些随机内存中写入 20 线程(或缺少线程)与此无关。 请停止在您的标题中写标签。我们不断编辑它们是有原因的。 【参考方案1】:

取消对未初始化(或空)指针的引用是未定义的行为。 在这种情况下发生什么取决于编译器。

你可能打算这样做:

int main(int argc, char **argv) 

    int x = 10;
    int *y = &x;
    *y = 20;

    std::thread t1([]);
    std::thread t2([]);

    t1.join();
    t2.join();

    return 0;

在这种情况下,无论线程是否存在,它都会起作用。

【讨论】:

以上是关于启动线程导致指针初始化时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

添加指向数组的指针时出现分段错误

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

使用指向指针 C++ 的指针时出现分段错误

为啥在访问二级指针时出现分段错误错误? C语言

为啥在尝试使用指针访问结构时出现此分段错误?

返回指针时出现分段错误[关闭]