在这个节目中:
#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';
行崩溃并停止执行吗?
答案 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);
}