读书人

关于指向恒量的指针

发布时间: 2013-11-03 15:39:14 作者: rapoo

关于指向常量的指针
已经知道char *s="abcd";是正确的,s是指向字符串常量"abcd的指针。但是int *p=&2为什么不对呢,p为什么不能指向int型常量2呢关于指向恒量的指针" 指针
[解决办法]
这个问题问得好,我以前也想过
因为2可以直接写在汇编指令里,也就是放在机器指令里了.既然放在机器指令里,也就没有什么地址而言了.但是字符串就不同了,整个字符串无法放在存放在机器指令里,只能放在内存空间里,存取访问.
比如
int a=2;
编译成汇编指令就是
mov dword ptr [a],2

[解决办法]
一元 & 运算符要求操作数是左值
2不用是左值 然后就死了

[解决办法]

1:    #include <stdio.h>
2: int *p;
3: void p2() {
00401000 55 push ebp
00401001 8B EC mov ebp,esp
00401003 83 EC 44 sub esp,44h
00401006 53 push ebx
00401007 56 push esi
00401008 57 push edi
4: int a;
5:
6: a=2;
00401009 C7 45 FC 02 00 00 00 mov dword ptr [ebp-4],2
7: }
00401010 5F pop edi
00401011 5E pop esi
00401012 5B pop ebx
00401013 8B E5 mov esp,ebp
00401015 5D pop ebp
00401016 C3 ret
--- No source file ---------------------------------------------------------------------------
00401017 CC int 3
00401018 CC int 3
00401019 CC int 3
0040101A CC int 3
0040101B CC int 3
0040101C CC int 3
0040101D CC int 3
0040101E CC int 3
0040101F CC int 3
8: int main() {
00401020 55 push ebp
00401021 8B EC mov ebp,esp


00401023 83 EC 40 sub esp,40h
00401026 53 push ebx
00401027 56 push esi
00401028 57 push edi
9: p=(int *)((char *)p2+0x0C);
00401029 B8 00 10 40 00 mov eax,offset p2 (00401000)
0040102E 83 C0 0C add eax,0Ch
00401031 A3 20 30 40 00 mov [p (00403020)],eax
10: printf("p2==0x%08x,p==0x%08x,*p==%d\n",(char *)p2,p,*p);
00401036 8B 0D 20 30 40 00 mov ecx,dword ptr [p (00403020)]
0040103C 8B 11 mov edx,dword ptr [ecx]
0040103E 52 push edx
0040103F A1 20 30 40 00 mov eax,[p (00403020)]
00401044 50 push eax
00401045 68 00 10 40 00 push offset p2 (00401000)
0040104A 68 A4 20 40 00 push offset string "p2==0x%08x,p==0x%08x,*p==%d\n" (004020a4)
0040104F FF 15 00 20 40 00 call dword ptr [__imp__printf (00402000)]
00401055 83 C4 10 add esp,10h
11: return 0;
00401058 33 C0 xor eax,eax
12: }
0040105A 5F pop edi
0040105B 5E pop esi
0040105C 5B pop ebx
0040105D 8B E5 mov esp,ebp
0040105F 5D pop ebp
00401060 C3 ret
//p2==0x00401000,p==0x0040100c,*p==2
//


1:    #include <stdio.h>
2: int *p;
3: void p2() {
00401000 55 push ebp
00401001 8B EC mov ebp,esp
00401003 83 EC 44 sub esp,44h
00401006 53 push ebx
00401007 56 push esi
00401008 57 push edi
4: int a;
5:
6: a=2;


00401009 C7 45 FC 02 00 00 00 mov dword ptr [ebp-4],2
7: }
00401010 5F pop edi
00401011 5E pop esi
00401012 5B pop ebx
00401013 8B E5 mov esp,ebp
00401015 5D pop ebp
00401016 C3 ret
--- No source file ---------------------------------------------------------------------------
00401017 CC int 3
00401018 CC int 3
00401019 CC int 3
0040101A CC int 3
0040101B CC int 3
0040101C CC int 3
0040101D CC int 3
0040101E CC int 3
0040101F CC int 3
8: int main() {
00401020 55 push ebp
00401021 8B EC mov ebp,esp
00401023 83 EC 40 sub esp,40h
00401026 53 push ebx
00401027 56 push esi
00401028 57 push edi
9: p=(int *)((char *)p2+0x0C);
00401029 B8 00 10 40 00 mov eax,offset p2 (00401000)
0040102E 83 C0 0C add eax,0Ch
00401031 A3 20 30 40 00 mov [p (00403020)],eax
10: printf("p2==0x%08x,p==0x%08x,*p==%d\n",(char *)p2,p,*p);
00401036 8B 0D 20 30 40 00 mov ecx,dword ptr [p (00403020)]
0040103C 8B 11 mov edx,dword ptr [ecx]
0040103E 52 push edx
0040103F A1 20 30 40 00 mov eax,[p (00403020)]
00401044 50 push eax
00401045 68 00 10 40 00 push offset p2 (00401000)


0040104A 68 A4 20 40 00 push offset string "p2==0x%08x,p==0x%08x,*p==%d\n" (004020a4)
0040104F FF 15 00 20 40 00 call dword ptr [__imp__printf (00402000)]
00401055 83 C4 10 add esp,10h
11: return 0;
00401058 33 C0 xor eax,eax
12: }
0040105A 5F pop edi
0040105B 5E pop esi
0040105C 5B pop ebx
0040105D 8B E5 mov esp,ebp
0040105F 5D pop ebp
00401060 C3 ret
//p2==0x00401000,p==0x0040100c,*p==2
//


[解决办法]
#pragma comment(linker,"/SECTION:.text,RW")
//上面这句让代码段可写
#include <stdio.h>
int *p;
int p2() {
int a;

a=2;
return a;
}
int main() {
p=(int *)((char *)p2+0x0C);
printf("p2==0x%08x,p==0x%08x,*p==%d\n",(char *)p2,p,*p);
*p=3;
printf("p2()==%d\n",p2());
return 0;
}
//p2==0x00401000,p==0x0040100c,*p==2
//p2()==3
//

读书人网 >C语言

热点推荐