C/C++基礎

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.