標籤:資料 沒有 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;}
C/C++基礎