标签:数据 没有 led 函数 mem col 情况 == print
struct结构体的定义与初始化问题
转载自http://blog.csdn.net/laoding1993/article/details/44077899
#include <stdio.h> #include <string.h> #include <stdlib.h> //和结构体差不多 // class STU // { // public: // int num; // int add; // }; struct STU { int num; int add; }; void var_no_init() { STU stu; printf("非指针变量的初始化:\n"); //printf("num(%p) = %d\nadd(%p) = %d\n",&stu.num,stu.num,&stu.add,stu.add); //使用了未初始化的局部变量"stu" //运行成功,输出地址(%p是输出十六进制) printf("num (%p)\nadd (%p)\n", &stu.num, &stu.add); } void point_no_init_malloc() { STU* stu; printf("指针变量未初始化&&分配内存:\n"); //printf("stu = %p\n", stu);//使用了未初始化的局部变量"stu" printf("stu = %p\n", &stu); //程序可输出地址,但为乱码,输出值地址值为num(CCCCCCCC),add(CCCCCCD0),相差依然为4. //如果把上面一句printf("stu = %p\n", &stu);注释掉,再运行这一句,会出错。 printf("num (%p)\nadd (%p)\n", &stu->num, &stu->add); //崩溃,因为指针变量为初始化,指向了一个无法访问的指针,所以崩溃 // printf("num = %d\n", stu->add); //指针变量stu在定义时,系统为其分配了空间,它有自己的地址,可以通过&p输出。 //其内存空间的存储数据为垃圾值,不可直接对其操作 //结构在分配地址的时候,不管地址是否合法,都会顺序往下递增 增加地址 } //地址值是变量第一是系统分配的。 //在定义结构体时已经分配了内存空间,只是里面存的是随机数。 //对于指针变量来说,对其操作时,相当于对非法地址进行操作,所以程序会崩溃 //对于非指针变量来说,里面仅仅是垃圾值,程序也会正常输出,现在初始化后,则新值覆盖了旧值,程序就不会崩溃 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; // printf("指针变量初始化&&未分配内存:\n"); // stu->add = 1; // stu->num = 2; // printf("stu = %p\n", &stu); //这句话注不注释都会出错,使用了未初始化的局部变量"stu" // //你连stu的地址都还没确定初始化,还想去操作stu指向的地址空间? // // printf("num (%p)\nadd (%p)\n", &stu->num, &stu->add); // printf("num = %d\n", stu->add); // } // // void point_menst_no_malloc() // { // //程序崩溃,原因还是由于stu为初始化指向非法地址 // STU* stu; // memset(stu, 0, sizeof(STU));//这句话引发第一次崩溃,其实情况和上一个函数情况一样 // printf("指针变量memset&&未分配内存\n"); // printf("num (%p)\nadd (%p)\n", &stu->num, &stu->add); // printf("num = %d\n", stu->add); // } void ponit_memset_malloc() { STU* stu; stu = (STU*)malloc(sizeof(STU)); if (NULL == stu) { printf("Malloc Failed\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 ponit_init_malloc() { //毫无悬念可以运行过 STU* stu; stu = (STU*)malloc(sizeof(STU)); if (NULL == stu) { printf("Malloc Failed\n"); exit(1); } 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 ponit_no_init_already_malloc() { STU* stu; stu = (STU*)malloc(sizeof(STU)); if (NULL == stu) { printf("Malloc Failed\n"); exit(1); } printf("指针变量未初始化 && 分配内存:\n"); printf("num(%p) = %d\nadd(%p) = %d\n", &stu->num, stu->num, &stu->add, stu->add);//值为随机值 stu->add = 1; printf("num(%p) = %d\nadd(%p) = %d\n", &stu->num, stu->num, &stu->add, stu->add); } //int a; int main() { //var_no_init(); //point_no_init_malloc(); //var_already_init(); //point_already_init_no_malloc(); //point_menst_no_malloc(); //ponit_memset_malloc(); //ponit_init_malloc(); //ponit_no_init_already_malloc(); //int a; //printf("%d\n", a);//若a在里面未赋初值运行会出错,如果在外面则会输出0 //对于内置类型变量(如int,double,bool等),如果定义在语句块外(即{}外),则变量被默认初始化为0;如果定义在语句块内(即{}内),变量将拥有未定义的值。 system("pause"); return 0; }
标签:数据 没有 led 函数 mem col 情况 == print
原文地址:http://www.cnblogs.com/pureyes-cyl/p/7879442.html