目录
1.什么情况下会出现段错误?
答:一种可能是栈溢出
比如查看当前栈的大小,为8M
运行代码如下:
#include<stdio.h>
int main()
{
char buf[8*1024*1024];
printf("hello world!\n");
return 0;
}
运行后就会出现如下错误
将栈的大小设置为10M就可以正常输出:
linux进程栈大小最好不要设置为无限大,不然数据不安全
定义大的buf不建议使用数组,一般使用堆区 ,比如malloc
第二种是因为递归
第三种是空指针解引用、数组越界访问、使用已释放的内存
发生段错误的根本原因在于非法访问内存,即访问了权限未许可的内存空间
2.swap() 函数为什么不能交换两个变量的值
形参只有在函数被调用时才会在函数栈帧内分配存储单元,用来接收传进来的实参值。函数运行结束后,形参单元随着栈帧的销毁而被释放。变量作为实参传递时,只是将其值复制到形参的存储空间,在函数运行期间,改变形参的值并不会改变原来实参的值,因为两者存储在栈中不同的内存单元上。
3.一个函数有六个参数 分别放在哪个区?
在函数调用过程中,当要传递的参数个数小于4时,直接使用R0~R3寄存器传递即可;当要传递的参数个数大于4时,前4个参数使用寄存器传递,剩余的参数则压入堆栈保存。
·在上面的程序中,main()函数调用了f()函数,并传过去6个实参求和。根据ATPCS规则,除了前4个参数使用寄存器R0~R3传递,剩下的2个参数要通过压栈来传递。在参数传递过程中,各个参数压栈、出栈的顺序也要有一个约定,如上面的6个参数,是从右往左依次压入堆栈 。