人类简单说明了一下运行结果
程序代码:

程序代码:
#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编辑过]