Tag: 分段 故障

使用qsort和printf时出现分段错误

我正在尝试通过搜索md5哈希文件并使用bsearch在rockou数据库中找到它们来制作破解密码的程序。 我的问题是我遇到了由我的qsort或我的printf引起的分段错误(我运行Valgrind并且它说printf,但是操纵qsort会改变错误输出)。 我似乎无法在线找到解决方案,虽然我已经尝试刷新stdout以及在qsort函数中调整数组大小的不同方法。 char **dict = read_dict( argv[2] ); read_dict,我没有放在这里,因为它是一大堆代码,接受字典文件,将其拆分为字符串数组,将其格式化为hash:password,并为其设置mallocs空间。 然后它返回包含每个字符串的指针数组的指针。 int qcompare( const void *a, const void *b) { return strncmp( *((char **)a), *((char **)b), HASH_LEN); } qsort(dict, (sizeof(dict) / sizeof(dict[0])), sizeof(char *), qcompare); for (int i = 0; dict[i] != NULL; i++) { printf(“%s\n”, dict[i]); } 这里显示的printf不是我正在使用的那个,它只是我试图用来调试我的代码的一个更简单的。 这是我第一次发帖,所以希望我没有做任何格式化这个问题的错误。 提前感谢您提供的任何帮助。 read_dict按要求 char **read_dict(char *filename) […]

Pthreads矩阵乘法误差

我想在现有的串行矩阵乘法代码上使用pthreads。 我的目标是使用pthreads实现更好的执行时间,只是为了实现加速。 但那时我被困住了。 我的原始序列号,工作正常,我在大约15秒内完成1000×1000方阵乘法。 但是当我执行当前的pthreads程序时,我遇到了分段错误。 这是我的代码: #include #include #include #include int SIZE, NTHREADS; int **A, **B, **C; void init() { int i, j; A = (int**)malloc(SIZE * sizeof(int *)); for(i = 0; i < SIZE; i++) A[i] = malloc(SIZE * sizeof(int)); B = (int**)malloc(SIZE * sizeof(int *)); for(i = 0; i < SIZE; i++) B[i] […]

创建connect 4 board c程序时出现分段错误

我正在创建一个连接4游戏……我已经做了很多事情; 然而,我创建我的电路板的方式是静态的,它需要是动态的,所以我已经制定了一个辅助程序来解决这个问题,然后在我的主程序中实现它。 出于某种原因,这段代码中的if&else-if条件会产生分段错误,我无法弄清楚为什么…… // for the rows/columns of the board for(row = num_rows – 1; row >= 0; row–){ printf(“|”); for(col = 0; col < num_columns; col++){ if(aPtr[row][col] == '0') { printf("| X "); } else if(aPtr[row][col] == '1') { printf("| O "); } else { printf("| "); } } puts("||"); } 当我评论这些条件时,电路板打印就好了,看起来像这样 —— Connect […]

关于文件指针处的分段错误需要帮助

我有一个’C’程序遇到了一个奇怪的问题。我在包含“feof(fp)”的行中遇到分段错误。我正在尝试在linux上运行.. 我甚至使用gdb命令来回溯程序..但它没有用.. 检查我的示例代码.. char buf[2000],str[15],lno[5],def[15],ref[15],tmp[15],ch,ifile[20],ofile[20]; int i,j,oldi,count,c,r,d,f,t,lc=0; FILE *fp=NULL,*fpo=NULL; void xyzstart() { /* *Some operation that is not at all concerned with the file * */ } int main() { printf(“Enter the name of the input file\n”); gets(ifile); fp=fopen(ifile,”r”); if(fp==NULL) { printf(“Error”); exit(0); } printf(“Enter the name of the output file\n”); gets(ofile); fpo=fopen(ofile,”w”); if(fpo==NULL) { […]

为什么在setjmp()中调用函数会发生分段错误?

我不明白为什么在函数middleFunc() ,当在if ( setjmp(middle) )语句if ( setjmp(middle) )调用entry_point(arg)时,会出现分段错误。 #include #include jmp_buf start,middle,end; void finalFunc(void *v) { printf(“hello\n”); return ; } void middleFunc(void (*entry_point)(void *), void *arg) { //just debug : this does not cause segmentation fault entry_point(arg); if ( setjmp(middle) ){ //this casues the segmentation fault entry_point(arg); //once the entry point (finalFunc) is executed go […]

为什么我在C服务器程序中遇到分段错误(但有时只是)?

现在,我正在尝试编写一个简单的客户端/服务器应用程序,以便测量LAN上的各种大小的TCP消息的往返时间(我正在做时间客户端)。 该程序适用于小数据包大小(> 1000字节),但我最终得到一个分段错误:输入更大(10KB或更大)的11错误。 int main() { struct sockaddr_in sin; char buf[MAX_LINE]; int len; int s, new_s; /* build address data structure */ bzero((char *)& sin, sizeof( sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = htons( SERVER_PORT); /* setup passive open */ if (( s = socket( PF_INET, SOCK_STREAM, 0)) < 0) { perror("tcp program: […]

是否有可能在C中总是在数组大小上产生1的段错误?

假设你分配一些数组arr size n ,如下所示: int arr[n]; // Allocated fine printf(“%d”, arr[n]); // Segfault if possible 是否存在这样的数字n ,我总是可以在printf线上触发段错误? 这可能是某些操作系统特有的。 我知道它的未定义行为,并且我知道在访问它时将其更改为超出边界会影响另一个内存区域,这可能会导致我以后出现重大问题。 我的教授说它并不总是会出现段错误,而且我很好奇是否无论如何都要在某种情况下使用某种类型的操作系统或计算机创建一个相当大小的数组,每次都可以进行可靠的段错误。 这是可能的还是没有? 是否有一些我可以创建的条件会导致单个出界访问始终触发段错误。 理论上可能总是如此吗? 但是在实践中不会一直发生吗?

Pthreads无法解释的分段错误

我从Cormen着名的文本中实现了并行合并排序算法。 我使用pthreads在C中编写它,并在Win7 x64上使用MinGW编译(稍后在Ubuntu中使用GCC进行测试,结果相同)。 我在并行化方面的第一种方法是天真的……我在每个递归级别产生了一个新线程(这实际上是Cormen的伪代码所暗示的)。 然而,由于分段错误,这通常会导致太长时间或崩溃(我可以假设系统可以处理多少线程存在一些硬性限制)。 这似乎是递归并行化的常见新手错误,事实上我在这个网站上发现了类似的讨论 。 所以我改为使用该线程中的建议,即设置问题大小的阈值,并且如果生成新线程的函数被赋予小于阈值的集合(比如10,000个元素),那么它只是直接对元素进行操作,而不是为这么小的一组创建一个新线程。 现在一切似乎都运转良好。 我列出了下面的一些结果。 N是问题大小(一组整数[1,2,3,…,N]彻底加扰),阈值是我的并行排序和并行合并函数拒绝生成新线程的值。 第一个表显示以ms为单位的排序时间,第二个表显示每种情况下生成的排序/合并工作线程数。 查看下表中的N = 1E6和N = 1E7行,您可以看到,只要我降低阈值,允许超过~8000个合并工作者,我就会出现分段错误。 同样,我认为这是由于系统给予线程的一些限制,我很乐意听到更多关于这一点,但这不是我的主要问题。 主要问题是,为什么最后一行在尝试使用相当高的阈值时会出现段错误,这会产生预期的15/33工作线程(跟随前一行的模式)。 当然,这对我的系统来说并不是太multithreading。 完成的一个实例(表中右下方的单元格)使用了大约1.2GB的RAM(我的系统有6GB),并且与每行右侧的0个线程相比,线程版本似乎永远不会占用更多RAM。 我认为我没有达到任何类型的堆限制……大量的RAM可用,即使它被允许产生15/33线程也只需要~1GB。 我也不认为这是一个堆栈问题。 我设计的程序使用最小的堆栈,我不认为每个线程的占用空间都与问题大小N有关,只有堆。 我对此非常缺乏经验……但是我在gdb中做了一个核心转储堆栈回溯,堆栈顶部到底部的地址似乎足够接近以排除溢出。 我尝试在Windows中读取pthread_create的返回值…在崩溃前我得到了11次值(但它似乎没有触发崩溃,因为有几个11,然后几个0,即没有错误,然后另一个11)。 该错误代码是EAGAIN,资源不可用……但我不确定它在这里的含义。 而且,在Ubuntu中,每次出现崩溃时错误代码都是0。 我尝试了Valgrind并获得了很多关于内存泄漏的消息,但我不确定这些是否合法,因为我知道Valgrind需要额外的资源,而且我能够在没有Valgrind的情况下在其他问题集大小上获得这些类型的错误。 很明显它与问题规模和系统资源有关……我希望我缺少一些常识,这使得答案非常清楚。 有任何想法吗? 对不起文本的长墙…谢谢你,如果你已经阅读了这么远! 如果相关,我可以发布来源。 编辑:来源添加供参考: #include #include #include #include const int N = 100000000; const int SORT_THRESHOLD = 10000000; const int MERGE_THRESHOLD = 10000000; int sort_thread_count […]

Tricky Segmentation在C中的BST递归出错

我正在尝试使用递归插入方法(通常用于BST,IIRC)将字符串添加到二进制搜索树中,以便稍后我也可以使用递归将它们打印出来。 麻烦的是,我一直在得到一个我不太懂的分段错误。 相关代码如下(这段代码来自我的主函数): #include #include #include #include // Stores the size of the C-strings we will use; // Standardized to 100 (assignment specifications say // ALL strings will be no more than 100 characters long) // Please note that I defined this as a preprocessor // directive because using the const keyword makes it // […]

printf命令导致seg错误?

当我尝试初始化一个大的双维字符数组时,它工作得非常好。 但是当我添加一个简单的打印命令时,它会给我一个分段错误。 有关为什么会发生这种情况的任何想法? #include int main(void) { printf(“!”); char f[10000][10000]; } 没有printf命令,或者即使printf命令没有打印任何内容(即“”),它也能正常工作。 如果我让它打印任何东西它会给出错误。 有帮助吗?