Tag: segmentation fault

为什么char name 可以容纳多个字符?

当我遇到这种情况时,我正在对一个主题进行一些研究。 假设以下C代码: #include int main() { char name[1]; scanf(“%s”,name); printf(“Hi %s”,name); return 0; } 我已经使用-fno-stack-protector进行了编译,并使用大于1的输入进行了测试,就像John一样,令我惊讶的是,它有效! 当输入长于1时,它不应该抛出分段错误吗? 最终它打破了Alexander作为输入(9),但它适用于任何小于9的东西。 为什么输入的时间长于名称数组长度? PS:我使用Ubuntu(64位),gcc版本4.8.4(Ubuntu 4.8.4-2ubuntu1~14.04)和CLion作为IDE。

在C中调试破坏的静态变量(gdb损坏?)

我已经完成了很多编程,但在C中并没有太多,我需要有关调试的建议。 我有一个静态变量(文件范围)在执行multithreading程序大约10-100秒后被破坏(在OS X 10.4上使用pthreads)。 我的代码看起来像这样: static float some_values[SIZE]; static int * addr; addr指向有效的内存地址一段时间,然后被一些值(有时为0,有时非零)破坏,从而在解除引用时导致段错误。 使用gdb我已经validation了addr正在人们期望的some_values之后立即在内存中进行some_values ,所以我的第一个猜测就是我使用了一个越界索引来写入some_values 。 但是,这是一个很小的文件,所以很容易检查这不是问题。 显而易见的调试技术是在变量addr上设置观察点。 但这样做似乎在gdb造成了不稳定和无法解释的行为。 观察点在第一次分配到addr时触发; 然后在我继续执行之后,我立即在另一个线程中得到一个无意义的段错误…据说是在程序的不同部分访问静态变量的地址时的段错误! 但是gdb允许我以交互方式读取和写入该内存地址。 程序收到信号EXC_BAD_ACCESS,无法访问内存。 原因:KERN_PROTECTION_FAILURE,地址:0x001d5bd0 在mainloop.c:39中接收(arg = 0x0)的0x0000678d 39 sample_buf_cleared ++; (gdb)p&sample_buf_cleared $ 17 =(int *)0x1d5bd0 (gdb)p sample_buf_cleared 18美元= 1 (gdb)设置sample_buf_cleared = 2 (GDB) gdb显然很困惑。 有谁知道为什么? 或者有没有人有任何建议调试此错误而不使用观察点?

C:分段错误:GDB:

我有一个函数shortestPath(),它是Dijkstra算法的修改实现,用于我正在为我的comp2类工作的棋盘游戏AI。 我已经浏览了网站并使用gdb和valgrind我确切知道了段错误发生的位置(几小时前就知道了),但无法弄清楚导致问题的是什么未定义的行为或逻辑错误。 发生问题的函数被调用大约10倍并按预期工作,直到它与GDB发生段错误:“错误读取变量:无法访问内存”和valgrind:“读取大小为8的无效” 通常情况下这就足够了,但我无法解决这个问题。 也欢迎任何一般建议和提示…谢谢! GDB: https : //gist.github.com/mckayryan/b8d1e9cdcc58dd1627ea Valgrind: https : //gist.github.com/mckayryan/8495963f6e62a51a734f 以下是发生段错误的function: static void processBuffer (GameView currentView, Link pQ, int *pQLen, LocationID *buffer, int bufferLen, Link prev, LocationID cur) { //printLinkIndex(“prev”, prev, NUM_MAP_LOCATIONS); // adds newly retrieved buffer Locations to queue adding link types appendLocationsToQueue(currentView, pQ, pQLen, buffer, bufferLen, cur); // calculates distance […]

C指针混乱

我想在内存中存储一​​个字符串并稍后阅读: $$->desc.constant->base.id = (char*)malloc(200); sprintf($$->desc.constant->base.id, “%f”, $1); printf(“->%s\n”, $$->desc.constant->base.id); //LINE A printf(“->%i\n”, $$->desc.constant); //LINE B //SOME OTHER CODE //Then, later on in a function call: printf(“%i”, expr->desc.constant); // LINE D printf(“%s”, expr->desc.constant->base.id); // LINE C 虽然线路B和线路D显示相同的地址,但线路C中的printf失败并出现分段故障。 我错过了什么? 真的很感激任何帮助!

执行从x86程序集编译的程序时出现分段错误?

我是汇编语言的新手,我必须实现一个函数,在我的例子中是sin(x),可以从C源文件调用。 我必须制作两个单独的文件:* .c和* .s在ubuntu上通过gcc编译时都很好,但是当程序执行时它会给出错误“Segmentation fault”… 编译我输入: gcc -c -o sinc.o sinx.c -g3 gcc -c -o sins.o sinx.s -g3 gcc -o sinx sinc.o sins.o -g3 当我启动程序时: ./sinx 它打印: …….insert x: 我把x放进去然后: segmentation fault 它停止了 这是两个文件: /*———————————–Sin[x]—————————————-*/ extern float Sin(float x); //extern assembly function #include //necessary libraries int main() // main function { float x; //allocate variable […]

当strlen产生分段错误时,来自GetString()的C字符串

我在C中运行程序。当我运行程序时,我得到了分段错误错误。 在我回溯时它在gdb中告诉我 程序接收信号SIGSEGV,分段故障。 __strlen_sse2_bsf()at ../sysdeps/i386/i686/multiarch/strlen-sse2-bsf.S:51 51 movdqu(%edi),%xmm1 我相信它与strlen有关。 我使用strlen的唯一一次是: string s = GetString(); int stringlength = strlen(s); 当我更改strlen for sizeof错误停止时。 我的代码出了什么问题? GetString的文档 /* * Reads a line of text from standard input and returns it as a * string (char *), sans trailing newline character. (Ergo, if * user inputs only “\n”, returns “” not […]

使用fgets读取文件并在屏幕上打印其内容

我仍然认为自己是CI中的一个新的webby我试图读取文件,文件不是二进制,但它的大小从feb kbs的小尺寸到feb Mbs的大尺寸文件不等。我正在使用fgetsfunction,我已经参考了从这个链接,但编译后,我得到分段fault.i试图用gdb调试它,发现我能够打开文件,但无法读取。这是我的代码。 #include #define MAX_LENGTH 1048576 int main() { FILE *fp; char *result; char line[MAX_LENGTH]; fp =fopen(“/home/shailendra/sampleprograms/C/shail1.txt”,”r”); if(result=fgets(line,MAX_LENGTH,fp) != NULL) printf(“The string is %s \n”,result); else printf(“Error opening the file”); if(fclose(fp)) printf(“fclose error”); } 这个分段错误真的很糟糕。我明白这是由于内存分配不足但我使用了MAX_LENGTH 1048576,所以我不认为它必须造成任何问题。我曾用两个只有一行的小文件试过它和一个多行的大文件,但我无法弄清楚为什么我得到分段错误。 我也看了这个 ,但没有得到帮助。

递归调用中pthread的分段错误

鉴于下面的代码,如果我运行n> 16,我会遇到分段错误。 我认为它与堆栈有关,但我无法弄明白。 有人能帮我一把吗? 代码不是我的,真的不重要。 我希望有人能帮助我了解正在发生的事情。 这个问题非常相似,但是没有足够的信息(发布答案的人简要地谈到了这个问题,然后继续谈论另一种语言)。 此外,请注意,有两个演出并且没有递归,我可以(如果我做得对)成功创建超过16000个线程(尽管操作系统仅创建大约500个并且运行大约300个)。 无论如何,我在哪里得到seg故障,为什么? 谢谢。 #include #include static void* fibonacci_thread( void* arg ) { int n = (int)arg, fib; pthread_t th1, th2; void* pvalue; /*Holds the value*/ switch (n) { case 0: return (void*)0; case 1: /* Fallthru, Fib(1)=Fib(2)=1 */ case 2: return (void*)1; default: break; } pthread_create(&th1, NULL, fibonacci_thread, […]

读取文件时出现段错误

我想阅读整个文件内容并将其打印出来,但我得到一个段错误,我找不到代码有什么问题… #include #include int main() { FILE * file; long fsize; file = fopen(“./input.txt”,”r”); if(file != NULL){ //get file size fseek(file,0,SEEK_END); fsize = ftell(file); rewind(file); // print char * file_content; fgets(file_content,fsize,file); puts(file_content); } else{ printf(“open failure\n”); } fclose(file); return 0; }

二维arrays的动态分配

我正在使用邻接矩阵实现图形,但我无法解决分段错误。 任何人都可以帮助我指导二维矩阵的动态分配吗? 我还想知道2-D数组如何存储在内存中以及如何访问它。 #include #include struct Graph{ int V; // To represent number the vertex… int E; //To represent number the Edge….. int **Adj; // Two dimensional matrix to form the adjacency matrix… }; struct Graph *adjMatrixOfGraph(){ int i; //for scanning the edges between them …. int u,v; // for loop while initliasing the adjacency […]