关于char * c="hello"与char c[]="hello"的区别(面试宝典)
来源:互联网 发布:广东网络医院设在哪里 编辑:程序博客网 时间:2024/06/05 06:20
#include <stdio.h>
void main()
{
}反汇编结果如下
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,44h
00401016 push ebx
00401017 push esi
00401018 push edi
00401019 lea edi,[ebp-44h]
0040101C mov ecx,11h
00401021 mov eax,0CCCCCCCCh ;这里之前是VC debug特有的,主要是为了调试创建44h个自己内存,全部初始化CC 也就是int3 调试器用的。
00401026 rep stos dword ptr [edi]
4: char * c = "hello";
00401028 mov dword ptr [ebp- 4],offset string "hello" (00422020) ;把字符串的地址放进了第一个局部变量,c是变量分配在堆栈中也就是doord prt[bp-4]
5: printf( "%s\n",c);
0040102F mov eax,dword ptr [ebp- 4]
00401032 push eax
00401033 push offset string "%s\n" (0042201c)
00401038 call printf ( 00401070)
0040103D add esp, 8
总结下:char * c = "hello"; c是个分配在堆栈中的一个变量。里面装的是字符串hello的首地址,而hello是常量区。PE文件在编译的时候就确定了的。00401028
5:
0040102F
00401032
00401038
0040103D
下面再来看char c[]="hello";
#include <stdio.h>
void main()
{
char c[] = "hello";
printf( "%s\n",c);
}
反汇编:void main()
{
}
00401019 lea edi,[ebp-48h]
0040101C mov ecx,12h
00401021 mov eax,0CCCCCCCCh
00401026 rep stos dword ptr [edi];前面是调试用的不管
4: char c[] = "hello";
00401028 mov eax,[string "hello" (00422020)]
0040102D mov dword ptr [ebp- 8],eax;把hello的前4个字符放入[ebp-8]的堆栈内存中
00401030 mov cx,word ptr [string "hello"+4 (00422024)]
00401037 mov word ptr [ebp- 4],cx;把hello的第5个字符放入[ebp-4]高地址中
5: printf( "%s\n",c);
0040103B lea edx,[ebp- 8]
0040103E push edx
0040103F push offset string "%c\n" (0042201c)
00401044 call printf ( 00401070)
00401049 add esp, 8
00401028
0040102D
00401030
00401037
5:
0040103B
0040103E
00401044
00401049
上面我只是用"hello"做例子,如果是helloworld放入char c[]呢,那会是这样的。
dword ptr[ebp-c]="hell" dword ptr[ebp-8]="owor" word ptr[ebp-4]="ld"这样放。
总结下:
也就是说char []c = "hello";
"hello"是放在堆栈中保存的,跟上面的那个例子不同,由于hello是堆栈中的所以是可以修改的。而常量区里的是不可以修改的。因为PE的内存页属性是只读的。当然可以有办法强行修改它。那属于HACK技术了。
那c保存在哪里呢?c根本在内存中不存在,只是编译器的一个标记,用于编译期来计算地址用的。用完就不要了。
转自:http://blog.sina.com.cn/s/blog_4c258ba00100eada.html
- 关于char * c="hello"与char c[]="hello"的区别(面试宝典)
- 关于char * c="hello"与char c[]="hello"的区别
- 关于char * c="hello"与char c[]="hello"的区别
- 【转载】关于char * c="hello"与char c[]="hello"的区别
- 函数中char c[]="hello"与char * c = "hello"区别 -- C
- char c[5]="hello"和char *p="hello"区别
- C中char str[] = "hello word";与char *str = "hello word";
- char p[] = "hello world" 与 char *p = "Hello world" 的区别
- 关于 char p[]="hello world";与char *p="hello world";
- 关于char* arr="hello world"与char arr[]="hello world"
- char a[] = "hello world1"和char *p = "hello world2";的区别
- char a[] = "hello world1"和char *p = "hello world2";的区别
- char a[] = "hello world1"和char *p = "hello world2";的区别
- char *p= "hello"和char p[] = "hello"的区别
- char *n="hello"和char a[]="hello"的区别
- char *s=“hello” 和 char s[]=“hello”的 区别
- char p[] = "hello world" 与 char *p = "Hello world" 的差异
- char str[]="hello" 与 char *str="hello" 不是等价的
- ubuntu 安装 配置 应用软件
- 源代码管理工具
- 20130405,微软四月月安全补丁提前通知
- 获得执行计划方法六-dbms_xplan.diskplay_cursor
- 位运算符
- 关于char * c="hello"与char c[]="hello"的区别(面试宝典)
- 关于自己学习C++的一点点小感悟!
- java模版类与回调方法
- 中移动飞信推公众平台 被质疑抄袭微信
- 火狐联合三星开发下一代浏览器引擎Servo
- linux下bmp转化为jpeg程序源代码, jpeg图片压缩
- 20个优秀的前端框架
- VMware网络设置的三种方式
- 用友放弃野蛮生长战略 转型平台软件商