zoukankan      html  css  js  c++  java
  • (三)结构体指针、sizeof

    (一)结构体指针定义

    今天上班写了一段测试代码,结果在linux下编译出现段错误,刚开始一直找不到原因,后来找了度娘才搞懂了。我先贴出来第一次写的代码以及gcc编译器下报的错误:

    #include<stdio.h>
    typedef struct 
    {
    	int a;
    	char str;
    	int b[5];
    }St;
    int main()
    {
    	St * Ds;
    	Ds -> a = 5;
    	Ds -> str = 'a';
    	Ds -> b[5] = 2;
    	printf("a = %d
    c = %c
    b = %d
    ",Ds->a,Ds->str,Ds->b[5]);
    
    	St Ea;
    	Ea.a = 100;
    	Ea.str = 'B';
    	Ea.b[1] = 6;
    	printf("a = %d
    c = %c
    b = %d
    ",Ea.a,Ea.str,Ea.b[1]);
    	return 0;
    }
    

    在linux gcc编译器下编译没有报错但是执行程序出现段错误,报错如下:

    我们可以看到程序无法执行,而只定义St Ea结构体,执行下面的代码没有错误,当两个一起写时就出错。而之定义执行St* Ds结构体指针时执行程序时结果正确,但是同样会报段错误。因此在这里我们知道了St* Ds这个结构体指针应该有问题。

    后来查找资料总算知道了错误的地方,结构体指针在定义时一定要给它分配内存,不过不分配内存那这个指针指向的内存就是不确定的,gcc编译器不允许这种情况出现,因此就会报段错误。修改程序如下所示,显示结果正常,注意代码中红色是修改过的程序:

    #include<stdio.h>
    #include<stdlib.h>
    typedef struct 
    {
        int a;
        char str;
        int b[5];
    }St;
    int main()
    {
        St * Ds;
        Ds = (St *) malloc (sizeof(St));
        Ds -> a = 5;
        Ds -> str = 'a';
        Ds -> b[5] = 2;
        printf("a = %d
    c = %c
    b = %d
    ",Ds->a,Ds->str,Ds->b[5]);
    
        St Ea;
        Ea.a = 100;
        Ea.str = 'B';
        Ea.b[1] = 6;
        printf("a = %d
    c = %c
    b = %d
    ",Ea.a,Ea.str,Ea.b[1]);
        return 0;
    }

    编译程序,结果如下所示:

    我们看到程序编译执行都正常。

    在这里我们总结一下:今后在写从c代码时遇到指针的定义,一定要注意给它分配内存,如果不分配内存便会出错,在这里我们给结构体指针分配内存有两种方法,分别如下:

    1、使用malloc给指针分配内存

    St* Ds;
    Ds = (St*)malloc(sizeof(St));

    2、使结构体指针指向一个已经定义了的机构体。如下所示

    St* Ds;
    St Str_A;
    Str_A.a = 0;
    Ds = &Str_A;

    二、sizeof

    sizeof的作用是在c语言中计算数据类型或者表达式所占的内存大小,注意它不是函数,sizeof是在程序编译时执行,而不是在等到程序执行时才执行。要使用sizeof需要包含添加头文件#include<stdilb.h>

    计算结构体等变量使用sizeof时要注意给这个变量加小括号,不加就会出错;sizeof(变量);

  • 相关阅读:
    VS编译 x64版本zlib库
    如何导出标准模板库(STL)类的实例化和包含STL类对象数据成员的类
    早前阅读live555源码做的笔记
    windows下 jemalloc编译
    简单的BSON OID生成实现
    Qt5.9静态库编译VS2015-x64
    [trouble shoot]atol和atoll
    LeetCode[Linked List]: Remove Duplicates from Sorted List II
    HighCharts实现多数据折线图分列显示
    用户空间驱动
  • 原文地址:https://www.cnblogs.com/zhangshenghui/p/5362549.html
Copyright © 2011-2022 走看看