下面以一个例子来引出这种错误:
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <string.h>
void func(int *p)
{
p = (int *)malloc(sizeof(int) * 10);
memset(p, 0, sizeof(p));
p[0] = 1;
}
int main()
{
int *p = NULL;
func(p);
cout << p[0] << endl;
return 0;
}
一个很简单的函数,就是给*p
在函数中分配空间并将p[0]
置成1,最后打印输出p[0]
。但是运行的结果却是segmengt fault
。
我们通过查看这段程序的汇编代码来分析一下出现段错误的原因。
Dump of assembler code for function func(int*):
0x00000000004008cd <+0>: push %rbp
0x00000000004008ce <+1>: mov %rsp,%rbp
0x00000000004008d1 <+4>: sub $0x20,%rsp
0x00000000004008d5 <+8>: mov %rdi,-0x18(%rbp)
0x00000000004008d9 <+12>: mov $0x28,%eax
0x00000000004008de <+17>: mov %rax,%rdi
0x00000