segmentation-fault 相关问题

访问不属于您的进程的内存时会发生分段错误。使用此标记以及指示语言的标记和指示操作系统的标记。分段错误通常是使用指针变量(通常包含无效地址)或缓冲区溢出的解除引用操作的结果。无效指针值的根本原因可能是远离产生分段错误的位置。

C BogoSort 中的分段错误

我已经开始学习c并且想用它来编程bogosort。我编码了大部分部分,但当我开始时,我遇到了分段错误错误,但不知道为什么。 这是我的代码: #包括 我已经开始学习 c 并想用它来编写 bogosort 程序。我编码了大部分部分,但当我开始时,我遇到了分段错误错误,但不知道为什么。 这是我的代码: #include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdbool.h> int tries = 0; int bogo[7]; int length = sizeof(bogo) / sizeof(bogo[0]); void setBogo(); void printBogo(); bool bogoFinished(); void sortNew(); int main() { setBogo(); while (!bogoFinished()) sortNew(); printBogo(); printf("Versuche benötigt: %d", tries); return 0; } void setBogo() { srand(time(NULL)); for (int i = 0; i < length; i++) bogo[i] = rand() % 100; } void printBogo() { for (int i = 0; i < length; i++) printf("Pos.: %d, Value: %d\n", i, bogo[i]); } bool bogoFinished() { int letzte = 0; for (int i = 1; i < length; i++) if (bogo[i] < bogo[letzte]) return false; else letzte = i; return true; } void sortNew() { srand(time(NULL)); tries++; for (int i = 0; i < length; i++) { int value = bogo[i]; int ran = rand(); bogo[i] = bogo[ran]; bogo[ran] = value; } } 代码如何工作: 首先,我用随机整数设置数组中的所有位置。然后,在 while 循环中检查数组是否已排序。如果是,则数组将再次随机排序。初始化数组的算法之前有效,所以我认为这是在度假部分的某个地方引起的。 罪魁祸首是bogo[i] = bogo[ran];(以及下面一行),因为rand()返回0到RAND_MAX范围内的值,这是一个未指定的,但通常相当大的整数;肯定比你的长度为 7 的数组大。 要保持在范围内,请改用 rand() % length。

回答 1 投票 0

尝试初始化结构内的类对象会导致分段错误

我正在尝试使用 C++ 的程序,以不同的颜色将文本打印到终端。 我有以下代码,其中包含 letter_template 结构中使用的 Color 类,即

回答 2 投票 0

尝试初始化嵌套在 typedef 内的类对象会导致分段错误

我正在尝试使用 C++ 的程序,以不同的颜色将文本打印到终端。 我有以下代码,其中 Color 类嵌套在 letter_template typedef 中,进一步...

回答 1 投票 0

从存储为 std::function segfaults 的 lambda 返回 const 引用

这是代码: #包括 #包括 类测试类{ 民众: const std::vector &getStuff() const { 返回回调(); } 受保护...

回答 1 投票 0

Ncurses 库并从文件中读取

我应该使用什么函数才能从文本文件中读取一行,然后在 ncurses 窗口中打印它。我试过了: int main ( int argc, char **argv) { 文件*src; src = fopen (argv[1], ...

回答 1 投票 0

多维数组的分段错误,其大小在运行时确定[重复]

我创建了一个程序,该程序应该从二进制文件中读取两个 3D 矩阵,将它们相乘,然后将结果打印到二进制文件中。然而,虽然它成功编译,但当我运行它时,它给出...

回答 1 投票 0

大小在运行时确定的数组的分段错误

我创建了一个程序,该程序应该从二进制文件中读取两个 3D 矩阵,将它们相乘,然后将结果打印到二进制文件中。然而,虽然它成功编译,但当我运行它时,它给出...

回答 1 投票 0

我的矩阵读取程序出现分段错误

我创建了一个程序,该程序应该从二进制文件中读取两个 3D 矩阵,将它们相乘,然后将结果打印到二进制文件中。然而,虽然它成功编译,但当我运行它时,它给出...

回答 1 投票 0

读取二进制文件时出现分段错误(核心转储),memmove-vec-unaligned-erms.S:没有这样的文件或目录

我正在尝试调试一段读取我创建的二进制文件的代码。看来当要读取的元素数量高于某个阈值时,我编写的脚本会失败。 该文件包含...

回答 1 投票 0

在C中输入一个子字符串和一个字符串并从字符串中删除子字符串

由于出现分段错误,我无法运行以下代码。在主体中,我输入一个字符串和一个子字符串,而在函数中,我捕获子字符串并使用我将其从字符串中删除...

回答 1 投票 0

C++ 创建 SIGSEGV 用于调试目的

我正在开发一个无锁共享变量类,我希望能够生成 SIGSEGV 错误以查看我的实现是否按计划工作。我尝试创建一个修改 p 的函数...

回答 3 投票 0

C语言中使用递归选择排序的分段错误

我已经写了一个C程序。它应该使用递归选择排序,但对于大输入(10000 或更多)会出现分段错误。调试器说段错误发生在 findim 函数中,但是......

回答 1 投票 0

Apache Avro C++ 段错误

我正在尝试使用 Avro C++ 库。我想创建一个 GenericDatum 实例,但使用以下代码时出现段错误。 avro_read.cc #包括 #包括 我正在尝试使用 Avro C++ 库。我想创建一个 GenericDatum 实例,但使用以下代码时出现段错误。 avro_read.cc #include <fstream> #include <avro/GenericDatum.hh> #include <avro/ValidSchema.hh> #include <avro/Compiler.hh> int main(int argc, char* argv[]) { // Read in and compile schema. std::ifstream in("schema.avsc"); avro::ValidSchema valid_schema; avro::compileJsonSchema(in, valid_schema); // Create a generic datum (segfaults). avro::GenericDatum datum(valid_schema); return 0; } CMakeLists.txt cmake_minimum_required(VERSION 3.20) project(repro CXX) find_package(unofficial-avro-cpp CONFIG REQUIRED) add_executable(avro_read avro_read.cc) target_link_libraries(avro_read PRIVATE unofficial::avro-cpp::avrocpp) vcpkg.json { "name": "segfault-repro", "version-string": "unversioned", "description": "A simple repro for the avro GenericDatum segfault", "dependencies": [ "avro-cpp" ] } 架构.avsc { "type": "record", "name": "__root__", "fields": [ { "name": "name", "type": [ "null", "string" ] }, { "name": "total", "type": [ "null", "long" ] } ] } 我使用 CMake 和 Vcpkg 进行编译以及以下命令: cmake -S . -B .build -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_TOOLCHAIN_FILE=$HOME/vcpkg/scripts/buildsystems/vcpkg.cmake cmake --build .build .build/avro_read 我尝试运行gdb(gdb .build/avro_read,但没有得到任何有用的东西 Program received signal SIGSEGV, Segmentation fault. 0x00005555555ecd70 in ?? () (gdb) bt #0 0x00005555555ecd70 in ?? () #1 0x000055555556b46d in main () 然后我就跑了valgrind --leak-check=full .build/avro_read ==2398834== Memcheck, a memory error detector ==2398834== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al. ==2398834== Using Valgrind-3.20.0 and LibVEX; rerun with -h for copyright info ==2398834== Command: .build/avro_read ==2398834== vex amd64->IR: unhandled instruction bytes: 0xF1 0x60 0x3E 0x0 0x0 0x0 0x0 0x0 0x10 0x7F vex amd64->IR: REX=0 REX.W=0 REX.R=0 REX.X=0 REX.B=0 vex amd64->IR: VEX=0 VEX.L=0 VEX.nVVVV=0x0 ESC=NONE vex amd64->IR: PFX.66=0 PFX.F2=0 PFX.F3=0 ==2398834== Invalid read of size 1 ==2398834== at 0x4DC7EC0: ??? ==2398834== by 0x4DC60DF: ??? ==2398834== by 0x7: ??? ==2398834== Address 0x1b is not stack'd, malloc'd or (recently) free'd ==2398834== ==2398834== ==2398834== Process terminating with default action of signal 11 (SIGSEGV) ==2398834== Access not within mapped region at address 0x1B ==2398834== at 0x4DC7EC0: ??? ==2398834== by 0x4DC60DF: ??? ==2398834== by 0x7: ??? ==2398834== If you believe this happened as a result of a stack ==2398834== overflow in your program's main thread (unlikely but ==2398834== possible), you can try to increase the size of the ==2398834== main thread stack using the --main-stacksize= flag. ==2398834== The main thread stack size used in this run was 8388608. ==2398834== ==2398834== HEAP SUMMARY: ==2398834== in use at exit: 84,688 bytes in 40 blocks ==2398834== total heap usage: 123 allocs, 83 frees, 97,888 bytes allocated ==2398834== ==2398834== LEAK SUMMARY: ==2398834== definitely lost: 0 bytes in 0 blocks ==2398834== indirectly lost: 0 bytes in 0 blocks ==2398834== possibly lost: 0 bytes in 0 blocks ==2398834== still reachable: 84,688 bytes in 40 blocks ==2398834== suppressed: 0 bytes in 0 blocks ==2398834== Reachable blocks (those to which a pointer was found) are not shown. ==2398834== To see them, rerun with: --leak-check=full --show-leak-kinds=all ==2398834== ==2398834== For lists of detected and suppressed errors, rerun with: -s ==2398834== ERROR SUMMARY: 2 errors from 1 contexts (suppressed: 0 from 0) [1] 2398834 segmentation fault valgrind --leak-check=full .build/avro_read 更新: avro 代码包含 any/boost any,具体取决于 C++ 版本。 https://github.com/apache/avro/blob/e932c9453be7b36e8874fe92edb3710beef4e47c/lang/c%2B%2B/api/GenericDatum.hh#L27-L31. #if __cplusplus >= 201703L #include <any> #else #include "boost/any.hpp" #endif 当我使用 C++ 14 编译时,没有出现段错误: set (CMAKE_CXX_STANDARD 14) 但是当我使用 C++ 17 或 C++20 时,我会出现段错误 set (CMAKE_CXX_STANDARD 17) 我认为 any_cast 之一是在 nullptr 和段错误上调用的。 我将使用 C++ 14,它编译时不会出现段错误。

回答 1 投票 0

Valgrind (C):进程以信号 11 (SIGSEGV) 的默认操作终止

我正在用 C 语言做一个关于 AVL 树的学校项目。代码出现以下错误。它编译得很好,但由于分段错误(核心转储)而终止。 ==210456== 无效区域...

回答 1 投票 0

当通过引用传递给函数时,整数数组似乎会自行释放

我正在尝试制作一个opengl程序。我制作了一些文件来抽象它的一些功能。这是我的代码: VAO_t vao[2]; // 第一个多边形 vaoGen(&vao[0]); vaoBind(&...

回答 1 投票 0

fread() 正在读取错误的数据,即使之前的块已正确读取

背景: 我正在尝试从 .goo 文件(Elegoo Mars 4 的 SLA 打印机文件格式)解析图层信息。 3D 模型的每一层都编码在存储在 goo_layer_definit 中的新二进制文件块中...

回答 1 投票 0

在Android设备中打开应用程序后,Kivy应用程序致命信号11(SIGSEGV),代码1(SEGV_MAPERR),tid 10919(SDLThread)中的故障地址0x40

致命信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR),tid 10919 (SDLThread) 中的故障地址 0x40,pid 10882 (org.test.myapp) 这是 logcat 的最后一行,我真的对发生的事情一无所知,因为......

回答 2 投票 0

快速排序分段错误

我用 C 实现了快速排序算法,并且在元素少于 30000 个的向量中正常工作。但是,它出现了分段错误 排队 if (vet[sup]>vet[sup/2+1]){交换(&vet[sup], &a...

回答 1 投票 0

Crypto++ ECDSA<ECP, SHA256>::PrivateKey::初始化造成分段错误

我有一个程序可以初始化 ECDSA 密钥对并存储它们。该程序有效,但现在,我在使用 Crypto++ 库初始化 ECDSA 私钥时出现分段错误。 这是

回答 1 投票 0

为什么这段代码会导致分段错误?

我有以下代码在 C++ 中打印向量。它适用于非空向量,但由于某种原因,当您尝试打印空向量时,它会出现分段错误。 #包括 我有以下代码来在 C++ 中打印向量。它适用于非空向量,但由于某种原因,当您尝试打印空向量时,它会出现分段错误。 #include <iostream> #include <vector> using namespace std; void printVector(const vector<int>& v) { cout << "{"; for (int i = 0; i < v.size() - 1; i++) cout << v[i] << ", "; if(v.size() > 0) cout << v[v.size() - 1]; cout << "}" << endl; } int main() { vector<int> v = vector<int>(0); printVector(v); } 对于空向量v,v.size() = 0,因此v.size() - 1 = -1,不> 0,因此永远不会进入循环。 if 条件也是如此。因此,唯一应该执行的两行是打印“{”和“}的行 ”. 相反,此代码输出准确(它甚至不打印第一个“{”): Segmentation fault (core dumped) 然后我尝试在代码中添加更多的计算,看看它在哪里中断。我做的第一个修改是 void printVector(const vector<int>& v) { cout << "{"; cout << "Check 1" << endl; for (int i = 0; i < v.size() - 1; i++) cout << v[i] << ", "; if(v.size() > 0) cout << v[v.size() - 1]; cout << "}" << endl; } 现在输出: {Check 1 Segmentation fault (core dumped) 这很奇怪,因为现在“{”确实出现了。我的下一个猜测是,.size() 函数可能会给出空向量的错误,因此 for 循环条件才是破坏的原因。为了测试它,我做了以下修改: void printVector(const vector<int>& v) { cout << "{"; int aux = v.size(); cout << "Check 1" << " " << aux << endl; for (int i = 0; i < v.size() - 1; i++) cout << v[i] << ", "; if(v.size() > 0) cout << v[v.size() - 1]; cout << "}" << endl; } 输出: {Check 1 0 Segmentation fault (core dumped) 我的结论是问题不可能出在 .size() 函数上,这是我对问题所在的最后猜测。然后我问聊天 gpt,它给了我这个代码: void printVector(vector<int>& v) { cout << "{"; for (int i = 0; i < v.size(); i++) { cout << v[i]; if (i < v.size() - 1) { cout << ", "; } } cout << "}" << endl; } 出于某种原因,这有效!对我来说,它看起来是完全相同的代码。我觉得我快要疯了。这是一个如此简单的程序,我什至无法让它工作/找到错误。 v.size() 是无符号。根据语言规则,无符号减去某个整数值的结果也是无符号的。 因此,当vector为空时,v.size()-1不是-1,而是它的无符号等价物,它(以2s补码表示)是一个大的正值(在典型的64位平台上它将是2^64-1)即 18,446,744,073,709,551,615)。 因此,您的 for 循环相当于: for (int i = 0; i < a_large_positive_integer; i++) 并且在第一次迭代中尝试访问 v[0],这是超出范围。 因此出现分段错误。 size() - 1 使用 无符号 整数,并且由于 size() 是 0,结果将回绕并成为可能的最大 size_t。 另一种方法是检查 vector 是否非空,然后打印第一个值,然后打印其余的值,前面加上 ,: void printVector(const std::vector<int>& v) { std::cout << '{'; if (!v.empty()) { auto it = v.begin(); std::cout << *it; for (++it; it != v.end(); ++it) { std::cout << ", " << *it; } } std::cout << "}\n"; }

回答 2 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.