Programming 版 (精华区)
发信人: JJason (总统~~), 信区: Programming
标 题: [合集]char *p = "hello world";
发信站: 哈工大紫丁香 (2003年03月20日17:13:31 星期四), 站内信件
────────────────────────────────────────
gunslover (the thirteenth warrior) 于 2003年03月04日20:20:02 星期二 说道:
char *p = "hello world";
的具体编译过程是什么样的
内存是如何分配的
和char p[] = "hello world";有什么区别??
谢谢
────────────────────────────────────────
gplayer (昵称我还没想好) 于 2003年03月04日20:40:31 星期二 说道:
*P和p[]都是数组{h,e,l,l,o, ,w,o,r,l,d}的首地址
应该没有区别吧
────────────────────────────────────────
godkiller (一天到晚游泳的鱼) 于 2003年03月04日20:40:34 星期二 说道:
char *p=""hello world"
定义了一个指针p,他指向的是一个常量字符串,是不能改变*p的,更好的做法是
const char *p="hello world"
char p[]="hello world"
定义了一个字符数组,并将“hello world"作为初始值赋给p[],p[]是可以重新赋值的。
────────────────────────────────────────
redflag (红旗) 于 2003年03月05日09:00:32 星期三 说道:
前者,p 是字符串数组的首地址,*p是该地址的字符('h')。
后者,p 也是首地址,p[0]是该地址的字符('h')。
────────────────────────────────────────
Mygoogle (大美无言) 于 2003年03月06日11:33:35 星期四 说道:
首先,
给常量"hello……"分配内存,整个应用程序只分配一次,
也就是如果在其他函数中还有"hello……",并不在分配空间。
char *p=就是声明并让p=="hell……"的首地址
如果有两个char *p1="hello...",*p2="hello...",可见p1==p2;
char p[]=...是分配strlen("hello...")+1的内存空间,
并将该空间初始化为"hello..."。
────────────────────────────────────────
PowerStation (人若无名便可专心发电) 于 2003年03月06日11:36:33 星期四 说道:
感觉后面说反了,
分配给 char * p = "hello word"; 中的 内存才应该是 strlen(p)+1;
分配给 char p[] = "hello word"; 中的 内存应该是 strlen(p);
────────────────────────────────────────
Mygoogle (大美无言) 于 2003年03月06日11:40:05 星期四 说道:
vc6里我编译是那样啊
────────────────────────────────────────
zdd (SQL) 于 2003年03月06日13:14:41 星期四 说道:
分析得很透测
────────────────────────────────────────
PowerStation (人若无名便可专心发电) 于 2003年03月06日14:35:46 星期四 说道:
我的感觉和你的解释都不对@_@。
我刚才也看了一下,borland 的编译器是这么处理的:
char * p1 = "hello world";
生成变量 char * p1; 和数据 "hello world\0",p1 指向后者;
char * p2 = "hello world";
和前面一样,不会出现 p1 == p2,如果vc这样优化,让人费解:&
char p3[] = "hello world3";
不为 p3 生成存储空间,*p3 就是 'h',系统分配 "hello world3\0";
存储情况:p1, p2,"hello world3\0" 是在连续内存中的,
而前面的两个 "hello world\0" 在另一内存块里,虽然它们互相是连续的。
程序运行时,p1, p2, "hello world3" 是在程序段中,
两个 "hello world\0" 在数据段中。
────────────────────────────────────────
zhangyan (what are they doing?) 于 2003年03月06日14:38:19 星期四 说道:
how about const char* p1, and p2?
────────────────────────────────────────
PowerStation (人若无名便可专心发电) 于 2003年03月06日14:50:04 星期四 说道:
const char * p1 = "hello world";
const char * p2 = "hello world";
char p3[] = "hello world3";
和前面是一样的,p1、p2、"hello world3\0" 在一起,
两个 "hello world\0" 在一起。
────────────────────────────────────────
zhangyan (what are they doing?) 于 2003年03月06日14:51:11 星期四 说道:
其实编译器完全可以对这个进行常量折叠
hehe
────────────────────────────────────────
PowerStation (人若无名便可专心发电) 于 2003年03月06日14:56:41 星期四 说道:
这个应该可以有个优化选项,没有必要让编译器悄悄的做什么。
────────────────────────────────────────
zhangyan (what are they doing?) 于 2003年03月06日15:03:40 星期四 说道:
你用的是Release还是debug?
────────────────────────────────────────
PowerStation (人若无名便可专心发电) 于 2003年03月06日15:05:27 星期四 说道:
release 的怎么跟踪??
//这也不是一开始讨论的问题了,keke
────────────────────────────────────────
zhangyan (what are they doing?) 于 2003年03月06日15:10:21 星期四 说道:
也许release会做优化
用UltraEdit!
────────────────────────────────────────
PowerStation (人若无名便可专心发电) 于 2003年03月06日15:11:30 星期四 说道:
@_@
────────────────────────────────────────
zhangyan (what are they doing?) 于 2003年03月06日15:13:32 星期四 说道:
可惜俺手头连个C编译器都没有
────────────────────────────────────────
ssos (存在与虚无·守拙) 于 2003年03月06日15:14:54 星期四 说道:
自己做一个?
────────────────────────────────────────
zhangyan (what are they doing?) 于 2003年03月06日15:30:51 星期四 说道:
ft
────────────────────────────────────────
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.867毫秒