struct 结构体的定义及初始化问题

来源:互联网 发布:深圳软件培训哪家好 编辑:程序博客网 时间:2024/05/20 02:55

<p>废话不多说 直接贴代码,,,其实自定义结构体数据类型与基本数据类型 定义的变量,都是一个意思,,只是自己钻了牛角尖,老是绕不回来。。</p><p>这次工作中 又出现相同的问题,,决定一探究竟,彻底搞明白。。好了 直接贴代码,,代码中的注释很明白,,,,,</p>
#include <stdio.h>#include <string.h>#include <stdlib.h>typedef struct tag_stu{int num;int add;}STU;/*为num和add分配了内存,所以其存在内存地址值,也可输出num(0018FEEC)add(0018FEF0),相差4.由于未初始化,他们的输出值是 随机数。*/void var_no_init(){STU stu;printf("非指针变量未初始化:\n");printf("num(%p) = %d\nadd(%p) = %d\n",&stu.num,stu.num,&stu.add,stu.add);}/*程序可输出地址,但为乱码,输出值地址值为num(CCCCCCCC),add(CCCCCCD0),相差依然为4.程序执行到输出 值得时候,会崩溃。这是因为指针变量未初始化,指向了一个无权(法)访问的指针,所以崩溃。/**********************************************///这块很有意思,注意一下。//%p输出的是stu这块内存空间存储的指针值。//以上可以看出:1:指针变量stu在定义时,系统为其非配了空间,其有自己的地址 可以通过&p输出。//2:其内存空间的存储数据为垃圾值,不可对其直接操作。//结构体在非配地址的时候,不管地址是否合法,,都会顺序往下递增 增加地址。/*********************************************/*/void point_no_init_malloc(){STU *stu;printf("指针变量未初始化&&分配内存:\n");printf("stu = %p\n",&stu);printf("num(%p)\nadd(%p) \n",&stu->num,&stu->add);printf("num = %d\n",stu->add);}/*地址值是变量定义时系统分配的。再定义结构体的时候已经分配了内存空间,只是里面存储的是随机数。对于 指针变量来说,对其操作时 相当于对非法地址进行操作,所以程序会崩溃。对于 非指针变量来说,里面仅仅是垃圾值,程序也会正常输出。现在初始化后,则新值覆盖了旧值。程序不会崩溃。*/void var_already_init(){STU stu;stu.num = 1;stu.add = 2;printf("非指针变量初始化:\n");printf("num(%p) = %d\nadd(%p) = %d\n",&stu.num,stu.num,&stu.add,stu.add);}/*指针变量未正确初始化,其指向非法地址,不可直接对其进行操作。程序会崩溃。*/void point_already_init_no_malloc(){STU *stu;//stu->add = 1;//stu->num = 2;printf("指针变量初始化&& 未分配内存:\n");printf("num(%p)\nadd(%p) \n",&stu->num,&stu->add);printf("num = %d\n",stu->add);}/*此函数 是借助memset为结构体变量初始化。程序会崩溃。原因还是 由于stu为初始化 指向非法地址。*/void point_memset_no_malloc(){STU *stu;memset(stu,0,sizeof(STU));//这句会引发第一次崩溃,,stu指向非法地址,对其操作会导致程序崩溃printf("指针变量memset && 未分配内存:\n");printf("num(%p)\nadd(%p) \n",&stu->num,&stu->add);printf("num = %d\n",stu->add);}/*程序得到预计结果。(0,0)先是malloc为stu分配了内存空间,再利用memset初始化,程序可以正常运行。此时思考一个问题:为什么 不执行malloc时 memset就会报错? 因为malloc返回了一个有效值。可以对其地址进行操作*/void point_memset__malloc(){STU *stu;stu = (STU *)malloc(sizeof(STU));if(NULL == stu){printf("Malloc Faild!\n");exit(1);}memset(stu,0,sizeof(STU));printf("指针变量memset && 分配内存:\n");printf("num(%p) = %d\nadd(%p) = %d\n",&stu->num,stu->num,&stu->add,stu->add);}/*不用多说 当然可以执行*/void point_init__malloc(){STU *stu;stu = (STU *)malloc(sizeof(STU));if(NULL == stu){printf("Malloc Faild!\n");exit(1);}stu->add = 1;stu->num = 2;printf("指针变量初始化 && 分配内存:\n");printf("num(%p) = %d\nadd(%p) = %d\n",&stu->num,stu->num,&stu->add,stu->add);}/*分配了空间但是没有初始化。 非配了空间 说明stu的地址值是合法的 就是其指向的地址里面存储的数据是随机的。*/void point_no_init_already_malloc(){STU *stu;stu = (STU *)malloc(sizeof(STU));if(NULL == stu){printf("Malloc Faild!\n");exit(1);}printf("指针变量未初始化 && 分配内存:\n");printf("num(%p) = %d\nadd(%p) = %d\n",&stu->num,stu->num,&stu->add,stu->add);}int main(){//var_no_init();point_no_init_malloc();//var_already_init();//point_already_init_no_malloc();//point_memset_no_malloc();//  point_memset__malloc();//point_init__malloc();//point_no_init_already_malloc();return 0;}/*****************************///以上说明,结构体也没啥特殊的 ,跟普通的数据类型定义变量是一样的。。。//程序在定义变量的时候,已经分配好了内存空间,只是里面存储的数据是随机的,是垃圾值。//对于非指针变量来说,,照样可以输出或者操作,仅仅是可能会得到不正确的结果,程序是可以正常运行的。//对于指针变量来说,同样。但是其内存空间存储的值 是被当做另外一个地址看待的,,所以 不初始化成有效的地址值得话,//程序可能会崩溃或者遇到不可预料的结果。//注:memset(p,0,size);是为指针变量p所指向的地址初始化。。/****************************/



0 0
原创粉丝点击