打印

指针和字符串那点事--C语言功底不扎实的勿进

[复制链接]
2496|10
手机看帖
扫描二维码
随时随地手机跟帖
沙发
dong_abc| | 2010-11-11 22:37 | 只看该作者
本帖最后由 dong_abc 于 2010-11-11 22:59 编辑

晕,看错了,不该进来

使用特权

评论回复
板凳
ShakaLeo| | 2010-11-11 23:06 | 只看该作者
char *p = "123";  
这里的"123"是字符串常量,编译器会把它分配在RO区域里。用IAR之所以分配在RAM里,很可能是因为你的工程的连接配置文件是把代码空间配置在ram里的,这样的话RO区域也会在RAM里。如果把连接配置文件的代码空间配置为flash,那么RO区域也应该相应的在flash里。这个我用IAR EWARM5.40验证过了。

使用特权

评论回复
地板
highgear| | 2010-11-12 00:51 | 只看该作者
顶楼上。

这个问题与 c 语言无关。ShakaLeo和流行音乐已经说明白了, 这与编译器及其设置和cpu的存储方式有关, 通常, 字符串之类的常量会被放在代码区, 编译器会禁止修改位于 ROM 代码区的字符串。

楼主应该仔细的查阅编译器的手册。

使用特权

评论回复
5
highgear| | 2010-11-12 01:09 | 只看该作者
要适应各种各样的存储芯片和五花八门嵌入式cpu的存储方式, ram, rom, 片内, 片外, 高速, 低速等等, 编译器也不容易。 比如 TI, 搞出一个 cmd 文件, 让用户来定义所使用的存储形式, 这种把问题推给使用者的办法, 减轻了编译器的负担, 却造成了很多初学者的困扰, 看看dsp版面上的问题, 一多半与 cmd 相关, 其实只要能仔细认真的阅读编译器手册, 就不会有太大的问题。

使用特权

评论回复
6
原野之狼| | 2010-11-12 01:47 | 只看该作者
char name1[] = "李刚";
char name2[] = "李刚的儿子";
char name3[] = "李刚的孙子";

SI si_array[] =
{
    {name1, 20, 1},
    {name2, 21, 2},
    {name3, 18, 3}
}:

使用特权

评论回复
7
armmage|  楼主 | 2010-11-12 08:31 | 只看该作者
3# ShakaLeo
谢谢Shakaleo 我用的是IAR for AVR 版本号忘记了 其实是同样一段程序在 ARM7和MEGA8之间移植, 所以你说的RO RW区的概念还有代码空间配置什么的,是ARM的概念吧IAR for AVR编译器手册我有大概看过,没找到类似ARM的代码空间配置信息,

使用特权

评论回复
8
armmage|  楼主 | 2010-11-12 08:34 | 只看该作者
5# highgear
ADS 我还算比较熟悉 不过这IAR么 版本好多 我用的给AVR单片机编程的版本,感觉是不是IAR FOR AVR不支持程序空间定位

使用特权

评论回复
9
armmage|  楼主 | 2010-11-12 08:38 | 只看该作者
6# 原野之狼
大侠你还真是干净利落啊  先定义数组 再赋值给指针······
但是你有想过实际应用中 这结构体统计的是几百号人的信息,名字,公司名,住址,这么多字符串我都去定义数组装,数组命名怎么办?全都是name1,name2.....name500?会疯的·····真不是我偷懒,没办法数据量太大

使用特权

评论回复
10
armmage|  楼主 | 2010-11-12 08:39 | 只看该作者
友情提示 请大家回帖去ARM区讨论吧 集中众人智慧把这问题说清楚 链接在1楼 谢谢

使用特权

评论回复
11
李冬发| | 2010-11-12 10:33 | 只看该作者
常量是不能修改的。
你的p是变量,内容是指针。你的*p是常量,不论其是在RAM或ROM里分配,都是常量,不能修改。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

286

帖子

1

粉丝