码迷,mamicode.com
首页 > 编程语言 > 详细

C/C++基础

时间:2017-11-22 15:52:32      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:数据   没有   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++基础

标签:数据   没有   led   函数   mem   col   情况   ==   print   

原文地址:http://www.cnblogs.com/pureyes-cyl/p/7879442.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!