#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student
{
int num;
char name[64];
};
int main(int argc, char const *argv[])
{
printf("先打印一下结构体大小:%d\n",sizeof(struct student));
printf("%d\n",sizeof(int));
void * node_p = (void*)malloc(sizeof(struct student)*3+sizeof(int));
printf("void*类型:node_p指向为 :%p\n",node_p);
printf("void*类型:node_p+1指向为:%p\n",node_p+1);
printf("void*类型:node_p+2指向为:%p\n",node_p+2); //因为node—p的类型是任意类型 所以位移一下,就往下走了一个字节
/**下面是打印结果
* node_p指向为 :0000022734076db0
node_p+1指向为:0000022734076db1
node_p+2指向为:0000022734076db2
*/
//下面转换一下类型
printf("int*:node_p指向为 :%p\n",(int*)node_p);
printf("int*:node_p+1指向为:%p\n",(int*)node_p+1);
printf("int*:node_p+2指向为:%p\n",(int*)node_p+2); //这种情况下位移就是4个了
/**
*node_p指向为 :0000023d236f6db0
*node_p+1指向为:0000023d236f6db4
*node_p+2指向为:0000023d236f6db8
*
*/
//然后下面我们进行一下 赋值一下int类型的个数
*((int*)node_p) = 3; //这样就把 整个内存最开始的数赋值为3了
//然后我们需要将地址偏移到int类型的数的下面去 到结构体地址开头
struct student * stu_t = (struct student *)(node_p +sizeof(int));
printf("stu_t的地址为:%p\n",stu_t);
printf("stu_t+1的地址为:%p\n",stu_t+1);
printf("stu_t+2的地址为:%p\n",stu_t+2);
/**
* stu_t的地址为: 0000021e21056db4
* stu_t+1的地址为:0000021e21056df8 e3c -df8 =0x44 也就是十进制的 68 所以对应上了
* stu_t+2的地址为:0000021e21056e3c
*/
//然后对剩下的学生结构体里面的内容进行赋值
printf("&stu_t[0]:%p\n",&stu_t[0]);
printf("stu_t:%p\n",stu_t);
/**
* &stu_t[0]:00000176f6146db4
* stu_t:00000176f6146db4
*/
//进行赋值
//stu[0]
stu_t[0].num = 10;
strcpy(stu_t[0].name,"name1");
//stu[1]
(stu_t+1)->num=20;
strcpy((stu_t+1)->name,"name2");
//stu[2]
(stu_t+2)->num =30;
strcpy((stu_t+2)->name,"name3");
printf("%s %d\n",__FILE__,__LINE__);
//进行循环取值
//首先拿到int类型的num 读出结构体数组内有多少个成员
int * num_t = (int*)node_p;
printf("打印一下看看拿到了没有num_t:%d\n",*num_t);
//然后拿到结构体数组的首地址进行遍历打印
struct student * stu_l = (struct student *)(node_p+sizeof(int));
for(int i=0;i<3;i++)
{
printf("num=%d,name = %s\n",stu_l[i].num,stu_l[i].name);
}
/**
* 打印一下看看拿到了没有num_t:3
* num=10,name = name1
* num=20,name = name2
* num=30,name = name3
*/
return 0;
}
以下是运行结果