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
- struct 结构体的定义及初始化问题
- 【Struct(结构体)杂谈之二】名不正则言不顺---Struct(结构体)的声明、定义及初始化
- 【Struct(结构体)杂谈之二】名不正则言不顺---Struct(结构体)的声明、定义及初始化
- linux C 结构体struct的定义和初始化
- 结构体的定义及初始化
- struct结构体的初始化及typedef的理解总结
- 结构体定义及初始化
- C中struct(结构体)初始化的问题
- struct结构体初始化
- struct结构体初始化
- struct option结构体的定义
- typedef struct和struct定义结构体的区别
- 结构体定义struct 与 typedef struct 的区别
- typedef struct和struct定义结构体的区别
- struct结构指针的初始化
- Cstring使用问题和struct结构体初始化方法汇总
- Cstring使用问题和struct结构体初始化方法汇总
- typedef struct与struct定义结构体
- C中#if 0 和#if 1
- ActiveRecord模式
- automake使用实例
- poj1564解题报告
- AngularJS 2.0会有哪些新特性?
- struct 结构体的定义及初始化问题
- Python lmdb
- 锯齿波 OP 积分电路
- iOS开发之静态库.a的制作教程
- Oracle 自动备份脚本
- Java程序员从笨鸟到菜鸟之(一)开发环境搭建,基本语法,字符串,数组
- 通透Gson@Expose注解、@SerializedName、解析json数据
- PHP详细彻底学习Smarty
- Paint setStrokeWidth方法:设置空心线宽