标题不雷就没人关心?还是说程序细节从不过问?
好吧 请看一个很简单的C语句
char *p = "123";
相信这句意思不难,但是我发现的问题是,字符串"123"被编译器创建和初始化在什么位置?flash只读区 还是在ram读写区?有人关心过么?
也许各位大侠们觉得这是个无须过多关注的问题,字符串具体在哪由编译器自己决定,简单说也就是爱放哪放哪,关我毛事。那么请看下面的真实测试
ADS1.2环境下 芯片是lpc21xx
char *p = "123"; //定义并赋值
*p = '5'; //修改指针指向的内容
此两句ADS编译通过
但是当运行到 *p = '5'; 时ARM7进入了 数据预取异常模式 简单说 就是卡在DataAbort模式下 死机了。在AXD环境下查看内存会发现,字符串"123"被编译器创建在flash上 属性是只读的 如果通过指针p去修改 编译不报错 但运行会死机。
当然 规范的编程我也知道,此处定义p指针加上const修饰就没问题了,至少隐患算是解决了。真正的问题又来了,当我把同样程序移植到 IAR编译环境时同样的
char *p = "123"; //定义并赋值
*p = '5'; //修改指针指向的内容
IAR编译器把字符串"123"创建在RAM上,p指针可以不用const修饰 并且也可以通过p修改字符串内容。
我想请大家讨论 或 指教
这种不同的编译器产生的代码默认定位问题是否有办法修改,我查过IAR的用户手册,没有办法做到控制"123"字符串的位置。
当然 定义成数据是可以的 char __flash a[] = "123";
但我想要的效果是 直接用字符串对指针赋值。
此贴在技术交流区发过 无人问津 遂转入ARM专业版 此问题不问个水落石出 誓不罢休
不是我矫情,上21前以问人无数,公司同事,大学同学,大学老师,网友····均表示从未关心此问题,也不需要关心(说起来有点火大) |