我似乎在strcmp函数的某处出现了分段错误。 我对C仍然很陌生,我不明白为什么它给了我错误。 int linear_probe(htable h, char *item, int k){ int p; int step = 1; do { p = (k + step++) % h->capacity; }while(h->keys[p] != NULL && strcmp(h->keys[p], item) != 0); return p; } GDB: Program received signal SIGSEGV, Segmentation fault. 0x0000003a8e331856 in __strcmp_ssse3 () from /lib64/libc.so.6 (gdb) frame 1 #1 0x0000000000400ea6 in linear_probe […]
我需要捕获第三方库清理操作中的分段错误。 有时候会在我的程序退出之前发生,而我无法解决这个问题的真正原因。 在Windows编程中,我可以用__try – __catch来做到这一点。 是否有跨平台或平台特定的方式来做同样的事情? 我需要在Linux,gcc。
#include <stdio.h> #define N 1024 int main(){ int i, j; int a[N][N]; int b[N][N]; for (i=0;i<N;i++){ a[i][i]=i; b[i][i]=i; } for (i=0;i<N;i++) for(j=0;j<N;j++) { printf("%d", a[i][j]); printf("%d", b[i][j]); } return 0; } 这个程序是分段错误的原因,但是如果我将N定义为1023,程序将正常工作。 为什么会发生?
我已经被这个错误困扰了很长一段时间,所以我决定把它发布在这里。 调用cudaMemcpy时发生此分段错误: CurrentGrid->cdata[i] = new float[size]; cudaMemcpy(CurrentGrid->cdata[i], Grid_dev->cdata[i], size*sizeof(float),\ cudaMemcpyDeviceToHost); CurrentGrid和Grid_dev分别指向主机和设备上的一个grid类对象,在这种情况下i = 0。 类成员cdata是一个浮点型指针数组。 对于debugging,就在这个cudaMemcpy调用之前,我打印出Grid_Dev->cdata[i] , CurrentGrid->cdata[i]和Grid_dev->cdata[i]的每个元素的值以及size一切看起来不错。 但它仍然以“分段错误(核心转储)”结束,这是唯一的错误信息。 cuda-memcheck只给了“进程没有终止成功”。 我目前无法使用cuda-gdb。 任何有关去哪里的build议? 更新 :现在好像我已经解决了这个问题,通过cudaMalloc设备上的另一个浮点指针A和cudaMemcpy将Grid_dev-> cdata [i]的值赋值给A,然后将cudaMemcpy A赋值给host。 所以上面写的代码片段变成: float * A; cudaMalloc((void**)&A, sizeof(float)); … … cudaMemcpy(&A, &(Grid_dev->cdata[i]), sizeof(float *), cudaMemcpyDeviceToHost); CurrentGrid->cdata[i] = new float[size]; cudaMemcpy(CurrentGrid->cdata[i], A, size*sizeof(float), cudaMemcpyDeviceToHost); 我这样做是因为valgrindpopup了“大小为8的无效读取”,我认为这是指Grid_dev->cdata[i] 。 我用gdb再次检查它,打印出Grid_dev->cdata[i]为NULL的值。 所以我想我不能直接取消引用设备指针,即使在这个cudaMemcpy调用。 但为什么 ? 根据该线程底部的注释,我们应该能够在cudaMemcpy函数中取消引用设备指针。 此外,我不知道如何cudaMalloc和cudaMemcpy的工作,但我认为由cudaMalloc一个指针,说这里,我们实际上分配这个指针指向设备上的某个地址的基本机制。 […]
为什么我编译时不会出错? #include <iostream> using namespace std; int main() { int *a = new int[2]; // int a[2]; // even this is not giving error a[0] = 0; a[1] = 1; a[2] = 2; a[3] = 3; a[100] = 4; int b; return 0; } 有人可以解释为什么发生这种情况。 提前致谢。)
我正在尝试编写代码来反转一个string(我只是想在C编程和指针操作方面做得更好),但我无法弄清楚为什么我得到了一个段错误 : #include <string.h> void reverse(char *s); int main() { char* s = "teststring"; reverse(s); return 0; } void reverse(char *s) { int i, j; char temp; for (i=0,j = (strlen(s)-1); i < j; i++, j–) { temp = *(s+i); //line 1 *(s+i) = *(s+j); //line 2 *(s+j) = temp; //line 3 } } 第2行和第3行导致分段错误。 […]
注:我们有很多段错误的问题,基本上是相同的答案,所以我试图将它们折叠成一个规范的问题,就像我们有未定义的参考 。 虽然我们有一个问题涉及到细分故障是 什么 ,它涵盖了什么 ,但没有列出很多原因。 最上面的答案是“有很多原因”,只列出一个,其他大部分答案都没有列出任何理由。 总而言之,我相信我们需要一个关于这个主题的组织良好的社区维基 ,其中列出了所有常见原因(然后是一些)来获得段错误。 目的是帮助debugging,正如答案的免责声明中所述。 我知道分段错误是什么,但在代码中很难发现它们常常看起来像什么。 毫无疑问,尽pipe无法详尽地列出, 但 C和C ++ 中分段错误的最常见原因是什么?
什么是分段错误? C和C ++有什么不同? 分段错误和悬挂指针如何相关?
以下代码在第2行上收到seg故障: char *str = "string"; str[0] = 'z'; printf("%s", str); 虽然这很好地工作: char str[] = "string"; str[0] = 'z'; printf("%s", str); 经MSVC和GCCtesting。