(三)结构体指针、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\nc = %c\nb = %d\n",Ds->a,Ds->str,Ds->b[5]);

	St Ea;
	Ea.a = 100;
	Ea.str = ‘B‘;
	Ea.b[1] = 6;
	printf("a = %d\nc = %c\nb = %d\n",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\nc = %c\nb = %d\n",Ds->a,Ds->str,Ds->b[5]);

    St Ea;
    Ea.a = 100;
    Ea.str = ‘B‘;
    Ea.b[1] = 6;
    printf("a = %d\nc = %c\nb = %d\n",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(变量);

时间: 2024-10-17 23:41:42

(三)结构体指针、sizeof的相关文章

[iOS]C语言技术视频-13-指针变量练习三(结构体指针变量)

下载地址: 链接: http://pan.baidu.com/s/1bnx2xm3 密码: t4mj

C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 本文由 arthinking 发表于315 天前 ⁄ itzhai.com原创文章 ⁄ C语言 ⁄ 评论数 3 ⁄ 被围观 1,775 views+ 指针数组: 在一个数组中,如果它的元素全部都是指针类

数组强制转换成结构体指针,结构体内部指针的指向问题

如果直接操作结构体成员是不会取到不期望的值 但是对于要求连续数据格式的时候需要考虑对齐的问题 例如通讯中的数据帧格式等 ,如 ip数据包等#pragma   pack(1) struct   tagStruct {     ... } t; #pragma   pack() 的方式来强制连续存放 其中前面   pack(1)   是指对齐边界为   1 1.几个结构体例子: struct{short a1;short a2;short a3;}A; struct{long a1;short a2

2015.9.10关于链表中结构体指针的错误

昨天用结构体指针写了一个双链表的程序,编译环境是VC6.0,之前写单链表的时候也是用的这个编译器,但是昨天出了一个让我很费解的问题,代码如下: /********************************************************** * C语言实现双链表 *文件名:list.c *作者:Mr Wan *编写时间:2015.9.9 *功能:实现双链表的简单操作 *版本:1.0 * ********************************************

C++结构体中sizeof(1)

sizeof sizeof操作符的作用是返回一个对象或类型名的长度,长度的单位是字节. 返回值的类型是标准库命名为size_t的类型,size_t类型定义在cstddef头文件中,该头文件是C标准库的头文件stddef.h的C++版本.他是一个和机器相关的unsigned类型,其大小足以保证内存中对象的大小. 1.什么是sizeof 首先看一下sizeof在msdn上的定义: The sizeof keyword gives the amount of storage, in bytes, as

结构体指针

结构体与指针 1.结构体指针的数值为某个结构体的内存空间的地址,从而指针指向某个结构体. 2.结构体指针的初始值为空(0),不指向任何结构体. 3.malloc操作:创建一个新的内存空间(从内存中选择一个内存空间存储结构体),p指向这个结构体,p的值为这个结构体的内存空间的地址. 4.结构体指针的赋值:一个结构体指针的数值等于另外一个结构体指针的数值,从而两个结构体指针指向相同的结构体.当对某个结构体进行访问时,选择的结构体指针只要满足该结构体指针指向这个结构体即可,即可以有很多种选择. 5.当

(C)struct结构体指针

结构体指针 指针结构与指针的关系亦有两重:其一是在定义结构时,将指针作为结构中的一个成员:其二是指向结构的指针(称为结构指针). 前者同一般的结构成员一样可直接进行访问,后者是本节讨论的重点. 结构指针说明的一般形式是: struct (结构类型名称) * (结构指针变量名);例如:struct date * pdate, today;说明了两个变量,一个是指向结构date的结构指针pdate,today是一个date结构变量. 语句: struct date{ int year; int mo

结构体指针之 段错误 具体解释(segmentation fault)

一个网友问了我一个问题.一个C程序执行出现了段错误,这个问题非常好.非常多刚開始学习的人都easy犯这个错误,详细代码例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 这个编译没有问题,可是执行是段错误    Segmentation fault 由于你定义了一个结构体指针p.用来指向此类

C语言--- 高级指针2(结构体指针,数组作为函数参数)

一.结构体指针 1. 什么是结构体指针?指向结构体变量的指针     结构体:     typedef  struct stu{                          char name[20];                          char sex;                          int age;                    }Student;     Student stu1 = {"zhangsan",'m',23};