Chinaunix首页 | 论坛 | 博客
  • 博客访问: 254045
  • 博文数量: 55
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 419
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-06 20:22
文章分类

全部博文(55)

文章存档

2014年(55)

我的朋友

分类: C/C++

2014-04-20 23:12:48


char * 和char[]赋值时的区别

char *s="abc";
char str[]="abccd";

经过反汇编,得到:

char *str="abc";   的汇编代码

mov         dword ptr [ebp-4],offset string "abc" (0046f034)

 

char str[ ]="abccd"; 的汇编代码

mov         eax,[string "abccd" (0046f02c)]
mov         dword ptr [ebp-0Ch],eax
mov         cx,word ptr [string "abccd"+4 (0046f030)]
mov         word ptr [ebp-8],cx

 

1、char *s="abc";

     看这个赋值:

     右边,是"abc",是个字符串常量,存在于内存某处(我的机器上是ds:0x0046f034),程序员不知道,编译器安排的,也没必要知道(当然,这个赋值之后,程序员就知道并能控制这个串了)。字符串常量所在内存是只读的。

     左边,字符指针s,赋值时候,把地址ds:0x0046f034的偏移地址("abc"所在),存放到指针变量s(其地址为 ds:0x0046f034)中。程序员能完全控制的内存只是指针变量所占据的这四个字节内存,只能改变该指针的指向,至于其指向的内存能不能写,那就看程序了,本程序是指向的只读内存,不能写!

2、char str[]="abccd";

     再看这个赋值:

     右边,和上面类似,是"abccd",也是个字符串常量,存在于内存某处(是ds:0x0046f02c),程序员不知道,编译器安排的(这个赋值之后,程序员还是不知道这个常量在哪里,因为并没有用指针指向这块内存,这和上面不同)。该字符串常量所在内存也是只读的。

     左边,字符数组str,赋值时候,把地址ds:0x0046f02c("abccd"所在)所指内存中的内容,复制到字符数组str开始(其地址为 ds:0x0013ff74)的内存中,每复制一个字符都会开辟一个字节(char型变量占1字节)内存来存放这个字符(这也是实现了数组元素个数的动态 确定)。从字符数组str开始的这部分存放这些字符的内存是程序员可以完全控制的,可读写,因此在这些内存写当然是没有问题的!

阅读(2336) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~