C Seg故障?你能找到它吗?因为我可以';T

C Seg故障?你能找到它吗?因为我可以';T,c,segmentation-fault,C,Segmentation Fault,到现在为止,我已经看了大约15遍了,都没有用。我不明白为什么这是seg断层?甚至连“打印”语句都没有,这毫无意义。错误代码确实有效(当我没有共享内存时),我有一个load.c程序,但它工作得很好(我100%确信这一点) Valigrind和GDB是你的朋友 请提供完整的代码,以便我们可以编译它并帮助您。盯着源代码并不是调试的神奇方法:) 确保使用编译器上的调试选项(-g等)进行编译 否则,请检查valgrind的memcheck。编译好程序后,运行: valgrind./myprogram 您可

到现在为止,我已经看了大约15遍了,都没有用。我不明白为什么这是seg断层?甚至连“打印”语句都没有,这毫无意义。错误代码确实有效(当我没有共享内存时),我有一个load.c程序,但它工作得很好(我100%确信这一点)


Valigrind和GDB是你的朋友

请提供完整的代码,以便我们可以编译它并帮助您。盯着源代码并不是调试的神奇方法:)

确保使用编译器上的调试选项(-g等)进行编译

否则,请检查valgrind的memcheck。编译好程序后,运行:

valgrind./myprogram

您可能会得到如下类似的输出:

==584== Use of uninitialised value of size 8
==584==    at 0x400480: segfaultme (p.c:6)
==584==    by 0x40049B: main (p.c:13)
==584== 
==584== Invalid write of size 4
==584==    at 0x400480: segfaultme (p.c:6)
==584==    by 0x40049B: main (p.c:13)
==584==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
==584== 
==584== 
==584== Process terminating with default action of signal 11 (SIGSEGV)
==584==  Access not within mapped region at address 0x0
==584==    at 0x400480: segfaultme (p.c:6)
==584==    by 0x40049B: main (p.c:13)
==584==  If you believe this happened as a result of a stack
==584==  overflow in your program's main thread (unlikely but
==584==  possible), you can try to increase the size of the
==584==  main thread stack using the --main-stacksize= flag.
==584==  The main thread stack size used in this run was 10485760.
用以下方法破解GDB:

gdb./myprog
然后输入rreturn

您将获得更多有关SEGFULT确切发生位置的信息:

(gdb) r
Starting program: /home/aiden/tmp/a.out 

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400480 in segfaultme (p=0x0) at p.c:6
6       *p = 22;
Missing separate debuginfos, use: debuginfo-install glibc-2.11.2-1.x86_64
(gdb) bt
#0  0x0000000000400480 in segfaultme (p=0x0) at p.c:6
#1  0x000000000040049c in main () at p.c:13
输入btreturn也会给你一个回溯。在上面的示例中,我们可以看到
segfaultme()
p.c
的第6行是问题所在,其中我取消引用
p
,它显示
segfaultme()
是由
main()
调用的


希望这有帮助!记住尽可能多地接触有助于你的工具

Valigrind和GDB是你的朋友

请提供完整的代码,以便我们可以编译它并帮助您。盯着源代码并不是调试的神奇方法:)

确保使用编译器上的调试选项(-g等)进行编译

否则,请检查valgrind的memcheck。编译好程序后,运行:

valgrind./myprogram

您可能会得到如下类似的输出:

==584== Use of uninitialised value of size 8
==584==    at 0x400480: segfaultme (p.c:6)
==584==    by 0x40049B: main (p.c:13)
==584== 
==584== Invalid write of size 4
==584==    at 0x400480: segfaultme (p.c:6)
==584==    by 0x40049B: main (p.c:13)
==584==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
==584== 
==584== 
==584== Process terminating with default action of signal 11 (SIGSEGV)
==584==  Access not within mapped region at address 0x0
==584==    at 0x400480: segfaultme (p.c:6)
==584==    by 0x40049B: main (p.c:13)
==584==  If you believe this happened as a result of a stack
==584==  overflow in your program's main thread (unlikely but
==584==  possible), you can try to increase the size of the
==584==  main thread stack using the --main-stacksize= flag.
==584==  The main thread stack size used in this run was 10485760.
用以下方法破解GDB:

gdb./myprog
然后输入rreturn

您将获得更多有关SEGFULT确切发生位置的信息:

(gdb) r
Starting program: /home/aiden/tmp/a.out 

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400480 in segfaultme (p=0x0) at p.c:6
6       *p = 22;
Missing separate debuginfos, use: debuginfo-install glibc-2.11.2-1.x86_64
(gdb) bt
#0  0x0000000000400480 in segfaultme (p=0x0) at p.c:6
#1  0x000000000040049c in main () at p.c:13
输入btreturn也会给你一个回溯。在上面的示例中,我们可以看到
segfaultme()
p.c
的第6行是问题所在,其中我取消引用
p
,它显示
segfaultme()
是由
main()
调用的


希望这有帮助!记住尽可能多地接触有助于你的工具

您的问题可能来自您使用的
shmat
。在C语言中,永远不要强制转换这样一个函数的返回类型。您觉得有必要使用它,这可能意味着您收到了一条虚假的错误消息,这是因为您缺少“sys/shm.h”头

在这种情况下,gcc采用
int
的返回类型,通常是32位的数量,并将其重新解释为指针。因此,
shmat
提供给您的地址的上半部分丢失


一般来说,不要抛弃问题。如果所有的头都写得很好,那么在C中很少需要Cast。强制转换系统函数的返回类型几乎总是错误的。

您的问题可能来自使用
shmat
。在C语言中,永远不要强制转换这样一个函数的返回类型。您觉得有必要使用它,这可能意味着您收到了一条虚假的错误消息,这是因为您缺少“sys/shm.h”头

在这种情况下,gcc采用
int
的返回类型,通常是32位的数量,并将其重新解释为指针。因此,
shmat
提供给您的地址的上半部分丢失


一般来说,不要抛弃问题。如果所有的头都写得很好,那么在C中很少需要Cast。强制转换系统函数的返回类型几乎总是错误的。

1。你试过valgrind吗?2.错误可能在header.h中的Wait或Signal或其他内容中,我们无法知道。main()必须声明为在调试器中返回intStart,以查看segfault发生的位置。这会给你一个提示。如果你希望我们在你的代码中发现bug,至少附加所有bug,这样我们就不用费劲地编译它了(例如,header.h是什么?)哦,对不起,我会附加header.h,但是我不太熟悉在unix中使用调试器(我习惯于Visual Studio,但因为我使用了很多Posix的东西,所以我不得不在unix中执行)。在unix中使用调试器有什么提示吗?而且它不是主要的int(),我试过了,我的其他文件也没有。1。你试过valgrind吗?2.错误可能在header.h中的Wait或Signal或其他内容中,我们无法知道。main()必须声明为在调试器中返回intStart,以查看segfault发生的位置。这会给你一个提示。如果你希望我们在你的代码中发现bug,至少附加所有bug,这样我们就不用费劲地编译它了(例如,header.h是什么?)哦,对不起,我会附加header.h,但是我不太熟悉在unix中使用调试器(我习惯于Visual Studio,但因为我使用了很多Posix的东西,所以我不得不在unix中执行)。在unix中使用调试器有什么提示吗?而且它不是主要的int(),我试过了,我的其他文件也没有。我们的教授给了我们示例代码,他就是这样得到的?我再也不知道了。不过,它似乎与G++配合得很好。但我的意思是,我是共享内存新手,所以大多数类代码都是从他的示例代码中采用的是的,在C语言中,没有必要将
void*
指针强制转换为任何其他数据指针
void*
是指针的全部类型,它与其他指针(数据指针)的赋值兼容。正是这种类型的转换带来了你的问题:对于C,一个未知的函数应该返回
int
,然后你的转换告诉他“我知道我在做什么”。所以这里的演员真的很糟糕,它隐藏了一个潜在的问题。你应该仔细指导你的教授采用一种更好的编程风格。啊哈,我想我明白你现在在说什么了。我只是看了一下我的操作系统教授的示例代码/注释