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毫秒