1.
点击(此处)折叠或打开
-
#include <stdio.h>
-
-
int main()
-
{
-
char *p="abcdefgh", *r;
-
long *q;
-
q=(long *)p;
-
q++;
-
r=(char *)q;
-
printf("%s\n", r);
-
-
return 0;
- }
解析:
16位系统:long是4字节,int是2字节 ;32位系统:long是4字节,int是4字节 ;64位系统:long是8字节,int是4字节
2.
struct tagABC
{
char cB;
short sC;
char cD;
long lA;
}*pAbc;
pAbc=0x100000;
那么pAbc+0x100=0x100C00;(ULONG)pAbc+0x100=0x100400; (ULONG*)pAbc+0x100=0x100400;(char *)pAbc+0x100=0x100400;
解析:
系统是32位的,且char占一个字节(byte),unsigned long 占4个字节
sizeof(tagABC)=12;
pAbc+0x100= 0x100000 + 0x100*sizeof(tagABC) //sizeof(tagABC)=12
(ULONG)pAbc+0x100= 0x100000 + 0x100*sizeof(ULONG) //sizeof(ULONG)=4(视机器而定)
(ULONG*)pAbc+0x100= 0x100000 + 0x100*sizeof(ULONG*) //sizeof(ULONG*)=4
(char*)pAbc+0x100= 0x100000 + 0x100*sizeof(char*) //sizeof(char*)=4
如果按十六进制乘所有数就都转成16进制后再相乘:
0x100*sizeof(tagABC) = 0x100*0xC = 0xC00;
0x100000+0xC00 = 0x100C00;
3.
union
{
int k;
char i[2];
}*s,a;
s=&a;
s->i[0]=0x39;
s->i[1]=0x39;
printf("%x\n", a.k);
如果int是4字节的话打印出来应该是0xcccc3839.看样子应该是VC平台。
共用体里里面定义的成员共用相同的存储空间,空间大小按照成员中最大的空间分配。
共用体里里面定义的成员共用相同的存储空间,空间大小按照成员中最大的空间分配。
所以k和i[2]共用一块4字节内存,Win32小端模式下低字节在前,所以在内存顺序是:k0 k1 k2 k3,但这4个字节又与i[2]共用,即k0与i[0]共用,k1与i[1]共用,所以i[0]=0x39,i[1]=0x38后同时给k0,k1赋值了。
由于VC调试态下默认将内存空间初始化为0xcc/0xcd,所以会k2=0xcc,k3=0xcc 打印出来k就是k3 k2 k1 k0 就是0xcccc3839了
若int占2位则结果是14393;(0x3839)
4.
#include<stdio.h>
#include<string.h>
void main()
{
int i; char acNew[20]; int j=0;
for(i=0;i<10;i++)
{
acNew[i]='0';
}
printf("%d\n",strlen(acNew));
}