分段错误,执行所有代码行后崩溃程序

时间:2015-10-06 13:05:18

标签: c segmentation-fault buffer-overflow

在这个节目中:

#include <stdio.h>

int main(void)
{
    char ch = 'A';
    char* ptr = &ch;

    ptr[8] = 'B';
    printf("ptr[8] = %c\n", ptr[8]);

    *ptr = 'C';
    printf("*ptr = %c\n", *ptr);
}

输出:

ptr[8] = B
*ptr = C
Segmentation fault (core dumped)

我认为该程序应该在第ptr[8] = 'B';行崩溃并崩溃,但程序确实执行了所有代码行然后崩溃,这是我真正得不到的。

它不应该在ptr[8] = 'B';行崩溃并停止执行吗?

3 个答案:

答案 0 :(得分:9)

通过写入ptr[8],您可能会在任何名为main的函数的返回地址上乱涂乱画,因此处理器试图跳转到一个奇怪的地方。 Core不喜欢它并且进行了大量的转储。

答案 1 :(得分:1)

(gdb) b main
Breakpoint 1 at 0x400535: file hello.c, line 5.
(gdb) r
Starting program: /home/sohil/a.out 

Breakpoint 1, main () at hello.c:5
5       char ch = 'A';
(gdb) c
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400551 in main () at hello.c:9
9       printf("ptr[8] = %c\n", ptr[8]);
(gdb) bt
#0  0x0000000000400551 in main () at hello.c:9
(gdb) 

你永远不会在ptr [8] ='C'上得到段错误,因为任何无效的内存写入,但是当你访问printf然后它会导致seg错误,如gdb所示。 < / p>

答案 2 :(得分:0)

为变量分配一些内存可能会有所帮助:

#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char ch = 'A';
    char *ptr;
    if (!( ptr = malloc(sizeof(char) * 100)))
        return 1;

    ptr[7] = ch;
    printf("ptr[8] = %c\n", ptr[7]);

    ptr[8] = 'B';
    printf("ptr[8] = %c\n", ptr[8]);

    *ptr = 'C';
    printf("*ptr = %c\n", *ptr);

    printf("*ptr = %c\n", ptr[0]);

    free(ptr);
}