C指针程序员面试宝典例题解析

本文通过一个具体的C语言程序实例,详细解析了指针和结构体在使用过程中可能出现的问题,特别是指针指向结构体成员后修改内存单元引发的异常情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序员面试宝典第五版P75面试例题9:以下程序会在哪一行崩溃?

C指针
strcut S{
int i;
int *p;
}
main()
{
S s;
int *p=&s.i;
p[0]=4;
p[1]=3;
s.p=p;
s.p[1]=1;
s.p[0]=2;
}

int*p=&s.i;//将指针p指向s.i,即指针变量p的值=s.i的地址
所以*p=p[0]=s.i=4;
p[1]=*(p+1)=s.p=3;

s.p=p;//将指针变量p的值,也就是s.i的地址值赋给s.p指针,即s.p指针指向了s.i,即s.p[0]=*s.p=s.i;

s.p[0]=s.i;s.p[1]=s.p;
s.p[1]=1;//即将s.p的值赋值为1,此时s.p指针指向了内存为0x1的地方,
s.p[0]=*s.p=2;//此处报错:引发了异常: 写入访问权限冲突。s.p 是 0x1。
//也就是程序此处无权利去更改内存地址为0x1的内存单元的内容;
//对于一个未做声明的地址直接进行访问导致的访问错误!

这里主要考察C的指针、内存单元的概念,以及结构体的存储方式,(内存对齐)的知识。
在x86,32位的编译环境下,结构体S的结构变量s 占8个内存单元(8个字节,一个字节为一个内存单元),其中int i;整型变量占4个字节,指针*p占4个字节的内存空间,整个结构变量s占8个字节的内存单元。

C的取地址运算符&,取内容运算符*

清楚C中内存单元的地址,和该地址对应的这个内存单元里面存放的内容的关键概念


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值