人类简单说明了一下运行结果
程序代码:
程序代码:
#include<stdio.h>
int main( void )
{
int x=1;
float a;
*(char**)&a="hello world";
int y=2;
printf("%s\n",*(char**)&a);
printf("x=%d\n",x);
printf("y=%d\n",y);
return 0;
}
这个代码32位操作系统是
x=1
y=2
但64位操作系统就是
x=0
y=2
也就是说64位指针占8个字节,但float只是占4个字节,这样把float强制转换成指针类型再赋值这样会修改了其它内存空间的数据 所以二楼的说法是有一定道理的~
借楼,最近就是在弄这些东西
程序代码:
程序代码:
#include<stdio.h>
#pragma pack(push,1)
struct s
{
int a;
char b;
struct
{
int ca;
char cb[2];
}*c;
};
#pragma pack(pop)
void* _alloc( void );
void _fill( void* );
void _read( struct s* );
void _free( void** );
int main( void )
{
void* p=_alloc();
_fill(p);
_read((struct s*)p);
_free(&p);
return 0;
}
#include<stdlib.h>
void* _alloc( void )
{
void* p=malloc(sizeof (int)+sizeof (char)+sizeof (void*));
*(p+sizeof (int)+sizeof (char))=malloc(sizeof (int)+2*sizeof (char));
printf("Entry=%p\n",p);
return p;
}
void _fill( void* p )
{
*(int*)p=1;
*(char*)(p+sizeof (int))='2';
**(int**)(p+sizeof (int)+sizeof (char))=3;
*((*(char**)(p+sizeof (int)+sizeof (char)))+sizeof (int))='4';
*((*(char**)(p+sizeof (int)+sizeof (char)))+sizeof (int)+sizeof (char))='5';
}
void _read( struct s* p )
{
printf("p->a=%d\n",p->a);
printf("p->b=%c\n",p->b);
printf("p->c->ca=%d\n",p->c->ca);
printf("p->c->cb[0]=%c\n",p->c->cb[0]);
printf("p->c->cb[1]=%c\n",p->c->cb[1]);
}
void _free( void** p )
{
free(*(void**)(*p+sizeof (int)+sizeof (char)));
free(*p);
*p=NULL;
}
说要一个正常学习的大学生要用指针填这些结构体,想想没几个能弄出来也是正常不过的事情
~
[此贴子已经被作者于2018-5-6 14:25编辑过]