当前位置:文档之家› c语言:结构体、枚举、宏和动态内存分配

c语言:结构体、枚举、宏和动态内存分配

c语言:结构体、枚举、宏和动态内存分配
c语言:结构体、枚举、宏和动态内存分配

结构体、枚举、动态内存分配和宏

==========================

【结构体】

一、认识结构体

结构体是一种复合的数据结构,是将基础变量类型和复合的变量类型封装成的新的数据结构体。结构体是一种自定义的类型。

struct sct{

int a;

char b;

};

strct sct aa;

int a;

//如果说,数组是相同类型变量的集合,那么结构体可以是相同元素的集合,也可以是不同元素的集合。

//这里声明了一个结构体,实际上是创建了一个新的变量类型,就像int,本身没有空间。只有用变量类型声明的变量才有空间。如int a。

// 比如int =9,错误。

int main(void)

{

struct sct s1,s2; //声明了两个结构体变量。

//s1有空间,所有s1是一个由int a;char b组成的空间。声明s1,如同声明了一个a和一个b。a和b称为s1的两个成员。

s1.a=9;

s1.b=’T’;

}

问:为什么声明结构体,声明结构体有什么用?

比如说存储班级学生的姓名和学号,

struct student{

char name[];

char ID[20];

};

struct student a[60];

【注】函数是对处理数据的功能的封装。

结构体是对存储数据的数据结构的封装。

二、结构体的赋值和初始化

struct point{

int x;

int y;

};

int main(void)

{

//初始化

//按照每个成员的初始化方式分别初始化。

struct point pp={3,4};

struct point pp2;

struct point pp3;

//赋值

//结构体可以整体赋值。但是没有结构体常量

pp2=pp;

//结构体也可以分别对成员赋值

pp3.x=5;

pp3.y=pp2.x;

printf(“%d %d\n”,pp3.x, pp3.y);

return 0;

}

【注】结构体里也可以包含其它结构体

struct rect{

int num;

struct point p;

};

struct rect re;

re.p.x=9;

re.num=2;

在IOS当中结构体的典型应用(储存坐标)

三、

typedef unsigned long size_t

结构体取别名

typedef existing new

struct point{

int x;

int y;

};

typedef struct point mypoint; //给结构体取别名

struct point aa;

mypoint aa;

应用

mypoint pp={3,4};

或者是

typedef struct point{

int x;

int y;

}mypoint;

或者是

typedef struct{

int x;

int y;

}mypoint;

四、返回结构体的函数

typedef struct{

float x;

float y;

}mypoint;

typedef struct{

float length;

float width;

}mysize;

typedef struct{

mypoint origin;

mysize size;

}myrect;

//因为结构体可以整体赋值,因此结构体可以整体作为函数返回值。myrect myrectmake(float x,float y,float length, float width) {

myrect rect={{x,y},{length,width}};

return rect;

}

int main(void)

{

myrect rect={{100,200},{200,50}};

// rect.origin.x=10;

// rect.origin.y=20;

//太麻烦

rect = myrectmake(10,20,160,32);

return 0;

}

五、结构体的大小

typedef struct{

int a;

int b;

}mysct;

mysct sct;

printf(“ld ld\n”,sizeof(mysct),sizeof(sct));

typedef struct{

int a;

char b;

}mysct;

mysct sct;

printf(“ld ld\n”,sizeof(mysct),sizeof(sct));

typedef struct{

int a;

char b;

char c;

}mysct;

mysct sct;

printf(“ld ld\n”,sizeof(mysct),sizeof(sct));

typedef struct{

char a;

int b;

char c;

}mysct;

mysct sct;

printf(“ld ld\n”,sizeof(mysct),sizeof(sct));

补齐

计算机寻址通常都是以4字节或者是8字节寻址。【注】不同设备对齐方式不同

网络传输时,跨越不同平台,数据传输可能会出错typedef struct{

char a;

int b;

char c;

}__attribute__((packed)) mysct; //不对其,塞满

mysct sct;

printf(“ld ld\n”,sizeof(mysct),sizeof(sct));

六、结构体指针

typedef struct{

int x;

int y;

int length;

int width;

}myrect;

int main(void)

{

myrect rect;

myrect *p=▭ //声明结构体指针

//问,如果想通过p访问rect中的x,应该怎么写?

//(*p).x=9; 可以

p->x = 9; //可以取代上述

printf(“%d\n”,rect.x);

return 0;

}

枚举

====

有一些数据,既不能用基础数据类型表示,也不能封装成结构体,比如型号,T180,TT180,在比如色彩,红色,黄色。

这些简单的、直观的数据,可以使用枚举进行存储。

//声明枚举

enum mycol{

RED=3, //添加枚举值

YELLOW,

BLUE,

BROWN,

WHITE

};

//RED代表0,在枚举声明之后,使用RED,就是使用0.YELLOW就是1,以此类推。

typedef struct{

int color; //mycol color;也可以

int length;

}mycat;

int main()

{

mycat cars[3];

for(int i=0;i<3;i++){

cars[i].color=RED;

}

switch(cars[0].color){

case RED:

printf(“red\n”);

break;

case YELLOW:

printf(“yellow\n”);

break;

default:

break;

}

printf(“%d %d\n”,RED,YELLOW);

return 0;

}

我们可以更改枚举值

enum mycol{

RED=1,

YELLOW,

BLUE,

BROWN,

WHITE

};

enum mycol{

RED,

YELLOW=2,

BLUE,

BROWN,

WHITE

};

修改枚举值,从修改的值以后生效,之前的值不变

enum mycol{

RED=1,

YELLOW,

BLUE,

BROWN=2,

WHITE

};

也是没有问题的。可以有两个枚举值相同。

练习:

1、创建一个公司员工的结构体,存储员工的姓名,工龄,年龄。在main函数中创建5个结构体组成的数组

编写函数

(1)从终端读入5名员工信息。

(2)按照年龄排序

(3)按照工龄排序

(4)分别按照当前顺序,打印每名员工的信息。

typedef struct{

char name[20];

unsigned int age;

unsigned int years;

}myworker;

//读取员工信息

void scan(myworker *worker, int n) //worker指向main中workers[0].

{

for(int i=0;i

scanf(“%s%d%d”,worker[i].name,&worker[i].age,&worker[i].years);

}

}

int main(void)

{

myworker workers[5]; //创建5名员工结构体

scan(workers,5); //读取员工信息

}

动态内存分配

==========

一、静态内存分配

所分配内存空间的大小,在编译时确定,在运行时无法修改。

如,栈段和只读数据段、数据段都是静态内存分配。

【缺点】

char a[100][3000]

现在我需要输入100个字符串数组,输入一个,打印一个,其中99个不超过3个字符,有一个占3000字符,问字符数组开多大。

至少要3000字符,因为它要能接受最长的字符串。

栈空间一般存储小于2M的数据,如果大数据要存放到堆中。

二、动态内存分配

分配的空间在堆段,由程序员在编写代码时规定空间的大小。在运行时可以任意的开辟、修改和释放空间大小。

int *p=(char *)malloc(1000);

//开辟1000个字节,这个空间开辟到堆里,不在当前栈里,只能通过指针访问。

//malloc返回值为void *,需要强转

int main(void)

{

char *p =(char *)malloc(1000); //开辟空间,可能会报错,比如内存紧张时,开辟空间会失败。

if(!p){

printf(“malloc error!\n”);

//perror不仅会打印文字,还会打印错误原因。

}

//p取*,*p只有一个字节,所以实际上p只是指向了堆的头一个字节。

//p[0]是堆的第一个字节。p+1指向堆的第二个字节。 p[1]是堆的第二个字节。

//空间本身没有类型,用p指向这个堆空间,将这个空间视为char[1000]的数组。

p[0]=9;

p[1]=8;

int *q=(int *)malloc(1000);

if(!q){

perror(“malloc”);

}

//如果用int *指针指向1000字节堆空间

q[0]=10;

q[1]=-10;

//将这1000字节视为250个int,视为int[250]数组

//堆空间使用完毕,必须释放

free(p);

free(q);

return 0;

}

//所谓开辟空间,就是将一段空间在系统中注册为已经被占用。

//释放一个空间,就是到系统中,解除注册,将空间注册为自由空间。

============

栈段

。。。

堆段

数据段

只读数据段

代码段

============

数组只能开足够大

int i=0;

while(i++<100){

int n;

scanf(“%d”,n); //先读入数据的大小

char *p=(char *)malloc(n+1); //根据数据开辟足够大不浪费的空间

scanf(“%s”,p);

printf(“%s”,p);

free(p); //每次循环重新开辟一个空间

}

练习

1、开辟一个100字节的堆,将每个字节用’a’填充。

2、开辟100个字节,填入25个整型数字,然后将数字输出。

三、静态内存分配和动态内存分配区别

静态内存分配

编译时决定空间的大小

确定空间大小的是编译器

开辟的空间在栈段,数据段,只读数据段。

自动释放

动态内存分配

程序运行时确定空间大小

确定空间大小的是程序员

开辟的空间在堆段

通过代码手动释放

who when where how

打印各数据存储地址

int b; //数据段

int add(int a,int b) //代码段

{

return a+b;

}

int main(void)

{

int a; //栈空间

int *p=(int *)malloc(100); //堆空间

char *str=“hello world”; //只读数据段

printf(“zhan %p\n”,&a);

printf(“dui % \t p\n”,p);

printf(“shujuduan %p\n”,&b);

printf(“zhudushujuaun %p\n”,str);

printf(“daimaduan%p”,add);

return 0;

}

===

一、认识宏

#define N 8

//将N声明为8,以后使用N,如同使用8

printf(“%d\n”,N);

int a=N;

【注】定义宏时,没有“;”。宏在C之前工作,不是C语法

宏是发生在预处理阶段的简单的字符串替换。

编译分四个步骤:

预处理C—>C //展开头文件,替换宏

编译C—>汇编//主体步骤

汇编汇编—>二进制

链接生成可执行程序

:%!xxd

gcc -o 2.i 2.c -E

//展开头文件,替换宏

gcc -o 2.s 2.i -S

gcc -o 2.o 2.s -c

gcc -o test 2.o

二、宏

【注】宏的作用千变万化,灵活使用有很多作用。这里介绍简单的一些功能。

将一些可能被修改的常量,声明为宏,便于使用和修改。

#define N 5

int a[N];

for(int i=0;i

scanf(“%d”,&a[i]);

}

for(int i=0;i

printf(“%d”,a[i]);

}

printf(“\n”);

#define URL “192.168.88.8”

printf(“%s\n”,URL);

以下程序也可以,因为预处理在编译之前

#include

#define M main

int M(void)

{

printf(“hello world!\n”);

return 0;

}

宏,在预处理阶段,就是作为字符串的替换,不讲究语法#define M main(

三、带参的宏

//宏的名字是标识符,写成大写,为了跟变量区别。

//编写宏,求一个数的平方

#define X(a) pow(a,2)

printf(“%d\n”,X(4));

写两个宏,一个求两数之和,一个求两数之积。

#define SUM(a,b) a+b

printf(“%d\n”,SUM(3,4));

printf(“%d\n”,SUM(3,4)*SUM(2,1));

宏,只是替换,不能向函数那样返回计算结果。

所以,宏要加括号

#define MUL(a,b) (a*b)

printf(“%d\n”,MUL(4,5));

printf(“%d\n”,MUL(4+1,5-1));

综上,要详细加括号

#define SUM(a,b) ((a) +(b))

#define MUL(a,b) ((a)*(b))

#define P(a,b) a(b)

P(printf, “hello world\n”);

printf(“hello world!\n”);

宏是字符串替换,替换时要考虑是否安全

练习(经典面试题)

1、写一个宏,求三个数的最大值

#define M(a,b,c) ((a)>(b)?(a):(b))>(c)? ((a)>(b)?(a):(b)):(c)

2、写一个宏,交换两个整型变量。(难)

#define M(a,b) {int tmp=a;a=b;b=tmp;}

C语言结构体实验报告

《高级语言程序设计》实验报告实验序号:8 实验项目名称:结构体

附源程序清单: 1. #include struct student { int num; char name[20]; char classname[20]; float score[3]; float aver_score; }stu[5]; void input() { int i; for(i=1;i<6;i++) { printf("第%d个同学",i); printf("请输入学号名字班级三门课程成绩:\n"); scanf("%d %s %s %f %f %f",&stu[i].num,stu[i].name,stu[i].classname,&stu[i].score[1],&stu [i].score[2],&stu[i].score[3]); } }; void averagescore() {

for(i=1;i<=5;i++) stu[i].aver_score=((stu[i].score[1]+stu[i].score[2]+stu[i].score[3])/3); printf("平均成绩:"); for(i=1;i<6;i++) printf("第%d个同学的平均成绩%f:\n",i,stu[i].aver_score); printf("\n"); }; void max() { int i,k=0; float temp=stu[1].aver_score; for(i=2;i<=5;i++) if(stu[i].aver_score>temp) {temp=stu[i] .aver_score;k=i;}; printf("成绩最好的同学:\n"); printf("%d %s %s %4.2f %4.2f %4.2f %4.2f\n", stu[k].num,stu[k].name,stu[k].classname,stu[k].score[1],stu[k].score[2],stu[k].score[3],stu[k].aver _score); }; void main() { input(); averagescore(); max(); } 2.#include struct worker { char name[20]; int workyear; float salary; }work[5]; void input() { int i; for(i=1;i<=5;i++) { printf("第%d个工人:",i); printf("请输入名字工作年限工资总额:\n"); scanf("%s %d %f",&work[i].name,&work[i].workyear,&work[i].salary);

C语言实验八结构体上机报告

《标准C语言程序设计》上机报告实验八结构体程序设计 专业:电子信息工程 班级:电信1301 学号:U201313480 姓名:秦行 完成日期:2014/6/9

一、实验目的: 1、掌握结构体类型的说明和结构体变量的定义; 2、掌握结构体变量成员的引用和对结构体变量的初始化; 3、掌握结构体数组及结构体指针变量的定义及使用。 4、理解并掌握结构体在函数间的传递; 5、进一步掌握复杂程序编译、连接和调试的技巧。 二、实验内容及要求(鼓励一题多解) ——以下均要求不得使用全局变量: 1 (1)、正确定义该表格内容要求的数据类型; (2)、分别输入各成员项数据,并打印输出(为简便起见,假设只有3名考生)。#include #include #define N 3 struct date { int year; int month; int day; }; struct student { unsigned int num; char name[20]; char sex; struct date birth; }; void main()

{ struct student tester[N]; int i; for(i=0;i #include #include #define N 10 struct worker { char name[20]; int salary; };

c语言结构体程序设计心得体会

c语言结构体程序设计心得体会 C语言是在国内外广泛使用的一种计算机语言。下面是为大家准备的,希望大家喜欢! 范文1 学习C语言已经一年多,对C也算得上半个入门者,期间也写过一些自娱自乐的代码。其实个人认为无论学习什么语言,最重要的是掌握习编程思想,然而C语言一种学习编程思想的基础语言。所以,C语言的重要性不言而喻。 一、课本 无论用的是什么书,要学好C语言,把书上的每一个例题、习题的代码读懂,这是学C最基本的要求。弄懂每一章的内容是什么?在C语言中有什么用?并尝试修改每一个例题的代码,采用不同的代码来实现题目的要求。 二、课堂 在每一节课上,注意老师讲的内容,有的知识,老师稍微提点,你就能弄懂,但是自己看书,或许你几天也弄不懂。老师更能清晰地让你明白所要求掌握的知识点。在课堂上,尽可能多的在草稿纸上写下你自己的代码,让老师看或是自己上机调试。 三、笔记 无论学习什么知识,笔记是重点,俗话说:好记性不如烂笔头。一个认真学习的人,总是记了很多笔记的,想学好

编程,你的笔记本上总有课本上的每一个例题代码的核心部分。以及八大经典的算法举例,递推、递归、穷举、贪心、分治、动规、迭代、分枝。 四、交流 想学好C语言,交流是必须的,尤其是学习C语言的新手,这里,我向大家推介——百度C语言贴吧,这里有很多的学习者,也有很多高手,在这里你能学到课本以及课堂上学不到的东西。和他人交流也是很重要的。 五、上机练习 这是学习好C语言的关重要的环节,无论你编程学得多好,上机实现才是目的,所以,不怕要辛苦,把你的每一段代码都敲进计算机,让计算机来实现,这样有助于你对程序的理解,并试着修改你的代码,让你的代码更精简,效率更高。平时没事的时候,在计算机上多敲代码,一个编程厉害的高手,他的计算机上会有多代码。 想成为编程高手的军规: 1、大学生活丰富多彩,会令你一生都难忘,但难忘有很多种,你可以学了很多东西而难忘,也会因为什么都没学到而难忘! 2、编程不是技术活,而是体力活。 3、C语言是基础,很重要,如果你不学好C语言,那么什么高级语言你都学不好。

C语言的代码内存布局具体解释

一个程序本质上都是由BSS 段、data段、text段三个组成的。这种概念在当前的计算机程序设计中是非常重要的一个基本概念,并且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统执行时的内存大小分配,存储单元占用空间大小的问题。 ●BSS段:在採用段式内存管理的架构中。BSS段(bss segment)一般是指用 来存放程序中未初始化的全局变量的一块内存区域。 BSS是英文Block Started by Symbol的简称。 BSS段属于静态内存分配。 ●数据段:在採用段式内存管理的架构中,数据段(data segment)一般是指 用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。 ●代码段:在採用段式内存管理的架构中,代码段(text segment)一般是指 用来存放程序执行代码的一块内存区域。这部分区域的大小在程序执行前就已经确定,而且内存区域属于仅仅读。 在代码段中。也有可能包括一些仅仅读的常数变量,比如字符串常量等。 程序编译后生成的目标文件至少含有这三个段。这三个段的大致结构图例如以下所看到的: 当中.text即为代码段,为仅仅读。.bss段包括程序中未初始化的全局变量和static变量。 data段包括三个部分:heap(堆)、stack(栈)和静态数据区。 ●堆(heap):堆是用于存放进程执行中被动态分配的内存段。它的大小并不 固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时。新分配的内存就被动态加入到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)

栈(stack):栈又称堆栈,是用户存放程序暂时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包含static声明的变量。static意味着在数据段中存放变量)。 除此以外,在函数被调用时。其參数也会被压入发起调用的进程栈中。而且待到调用结束后。函数的返回值也会被存放回栈中。 因为栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们能够把堆栈看成一个寄存、交换暂时数据的内存区。 当程序在运行时动态分配空间(C中的malloc函数),所分配的空间就属于heap。其概念与数据结构中“堆”的概念不同。 stack段存放函数内部的变量、參数和返回地址,其在函数被调用时自己主动分配。訪问方式就是标准栈中的LIFO方式。 (由于函数的局部变量存放在此,因此其訪问方式应该是栈指针加偏移的方式,否则若通过push、pop操作来訪问相当麻烦) data段中的静态数据区存放的是程序中已初始化的全局变量、静态变量和常量。 在採用段式内存管理的架构中(比方intel的80x86系统),BSS 段(Block Started by Symbol segment)一般是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时BSS 段部分将会清零。BSS 段属于静态内存分配。即程序一開始就将其清零了。 比方,在C语言之类的程序编译完毕之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中。 text和data段都在可运行文件里(在嵌入式系统里通常是固化在镜像文件里)。由系统从可运行文件里载入;而BSS段不在可运行文件里,由系统初始化。

C语言结构体(struct)常见使用方法

C语言结构体(struct)常见使用方法 基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量。 结构体定义: 第一种:只有结构体定义 [cpp]view plain copy 1.struct stuff{ 2.char job[20]; 3.int age; 4.float height; 5.}; 第二种:附加该结构体类型的“结构体变量”的初始化的结构体定义 [cpp]view plain copy 1.//直接带变量名Huqinwei 2.struct stuff{ 3.char job[20]; 4.int age; 5.float height; 6.}Huqinwei; 也许初期看不习惯容易困惑,其实这就相当于: [cpp]view plain copy 1.struct stuff{ 2.char job[20]; 3.int age;

4.float height; 5.}; 6.struct stuff Huqinwei; 第三种:如果该结构体你只用一个变量Huqinwei,而不再需要用 [cpp]view plain copy 1.struct stuff yourname; 去定义第二个变量。 那么,附加变量初始化的结构体定义还可进一步简化出第三种: [cpp]view plain copy 1.struct{ 2.char job[20]; 3.int age; 4.float height; 5.}Huqinwei; 把结构体名称去掉,这样更简洁,不过也不能定义其他同结构体变量了——至少我现在没掌握这种方法。 结构体变量及其内部成员变量的定义及访问: 绕口吧?要分清结构体变量和结构体内部成员变量的概念。 就像刚才的第二种提到的,结构体变量的声明可以用: [cpp]view plain copy 1.struct stuff yourname; 其成员变量的定义可以随声明进行: [cpp]view plain copy 1.struct stuff Huqinwei = {"manager",30,185}; 也可以考虑结构体之间的赋值: [cpp]view plain copy

C语言实验5(结构体)

实验五结构体 一、实验目的 1.掌握结构体类型变量的定义和使用。 2.掌握结构体类型数组的概念和使用。 二、实验内容 编写一个程序实现下面的功能: A.建立一个数组用于存储学生的学号、姓名和三门课程的成绩和平均成绩 B.输入学号后输出该学生的学号、姓名和三门课程的成绩 C.输入学号后删除该学生的数据 D.插入学生的数据 E.输出平均成绩在80分及以上的记录 F.退出 要求用循环语句实现B--E的多次操作 三、实验具体实验程序代码(要有注释)、测试结果(最好截图)和实验总结 1、实验代码 建立一个数组用于存储学生的学号、姓名和三门课程的成绩和平均成绩 输入学号后输出该学生的学号、姓名和三门课程的成绩 um,&stud[i].name,&stud[i].yingyu,&stud[i].shuxue,&stud[i].cc); stud[i].avg=(stud[i].yingyu+stud[i].shuxue+stud[i].cc)/3; } for(i=0;i

C语言结构体习题及答案

第9章结构体 1.定义以下结构体类型 struct s { int a; char b; float f; }; 则语句printf("%d",sizeof(struct s))的输出结果为【】。 A) 3 B) 7 C) 6 D) 4 2.当定义一个结构体变量时,系统为它分配的内存空间是【】 A)结构中一个成员所需的内存容量 B)结构中第一个成员所需的内存容量 C)结构体中占内存容量最大者所需的容量 D)结构中各成员所需内存容量之和 3.定义以下结构体类型 struct s { int x; float f; }a[3]; 语句printf("%d",sizeof(a))的输出结果为【】 A) 4 B) 12 C) 18 D) 6 4.定义以下结构体数组 struct c { int x; int y; }s[2]={1,3,2,7}; 语句printf("%d",s[0].x*s[1].x)的输出结果为【】 A) 14 B) 6 C) 2 D) 21 5.运行下列程序段,输出结果是【】 struct country { int num; char name[10]; }x[5]={1,"China",2,"USA",3,"France",4, "England",5, "Spanish"}; struct country *p; p=x+2; printf("%d,%c",p->num,(*p).name[2]); A) 3,a B) 4,g C) 2,U D) 5,S

6.下面程序的运行结果是【】。 struct KeyWord { char Key[20]; int ID; }kw[]={"void",1,"char",2,"int",3,"float",4,"double",5}; main() { printf("%c,%d\n",kw[3].Key[0], kw[3].ID); } A) i,3 B) n,3 C) f,4 D) l,4 7.定义以下结构体类型 struct student { char name[10]; int score[50]; float average; }stud1; 则stud1占用内存的字节数是【】。 A) 64 B) 114 C) 228 D) 7 8.如果有下面的定义和赋值,则使用【】不可以输出n中data的值。struct SNode { unsigned id; int data; }n,*p; p=&n; A) p.data B) n.data C) p->data D) (*p).data 9.根据下面的定义,能输出Mary的语句是【】。 struct person { char name[9]; int age; }; struct person class[5]={"John",17,"Paul",19,"Mary",18,"Adam",16}; A) printf("%s\n",class[1].name); B) printf("%s\n",class[2].name); C) printf("%s\n",class[3].name);

c语言中动态内存申请与释放的简单理解

c语言中动态内存申请与释放的简单理解 在C里,内存管理是通过专门的函数来实现的。与c++不同,在c++中是通过new、delete函数动态申请、释放内存的。 1、分配内存 malloc 函数 需要包含头文件: #include 或 #include 函数声明(函数原型): void *malloc(int size); 说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。 从函数声明上可以看出。malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小。比如: int *p; p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int); 或: int* parr; parr = new int [100]; //返回类型为 int* 类型(整数型指针),分配大小为sizeof(int) * 100; 而 malloc 则必须由我们计算需要的字节数,并且在返回后强行转换为实际类型的指针。 int* p; p = (int *) malloc (sizeof(int)); 第一、malloc 函数返回的是 void * 类型,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。所以必须通过 (int *) 来将强制转换。 第二、函数的实参为 sizeof(int) ,用于指明一个整型数据需要的大小。如果你写成:

C语言上机实验1-18

实验一C程序的运行环境及简单程序编写 一、实验目的 1.了解tc 2.0编译系统的基本操作方法,学会独立使用该系统。 2.了解在该系统上如何编辑、编译、连接和运行一个C程序。 3.通过运行简单的C程序,初步了解C源程序的特点。 二、实验内容 1.编写一个计算球体体积的程序,要求用户自行录入球体的半径。参考公式V=4/3πr3.。 2.编写一个程序,要求用户输入一个美金数量,然后显示出如何用最少的20美元、10美元、5美元和1美元来付款。 运行结果: Ener a dollar amount:93 $20 bills:4 $10 bills:1 $5 bills:0 $1 bills:3 实验二顺序结构程序设计 一、实验目的 1.熟悉C语言中的基本数据类型,掌握定义常量和变量以及对它们赋值的方法,了解数据输出时所用格式转换符。 2.掌握格式输入/输出函数的用法。 3.学会简单顺序程序的设计。 4.养成良好的程序设计习惯。 二、实验内容 1.编写一个程序,对用户录入的产品信息进行格式化。 Enter item number:583 Enter unit price:13.5 Enter purchase date(mm/dd/yyyy):3/24/2010 Item Unit Purchase Price date 583 $ 13.50 3/24/2010 2.编写一个程序,要求用户输入一个两位数,然后按数位的逆序打印出这个数。 Enter a two-digit number:28 The reversal is :82 实验三选择结构程序设计 一、实验目的 1.熟练使用if、switch编写程序。 二、实验内容 1.编写一个程序,确定一个数的位数。 Enter a number:374 The number 374 has 3 digits 假设输入的数最多不超过4位。提示:利用if语句进行数的判定。例如,如果数在0到

C语言结构体和共用体实验报告

实验九参考程序 实验 9- 1 /**************************************************************** * 实验 9.1 * * ( 1 )为某商店的商品设计合适的结构体 (PRODUCT) 。每一种商品包含编号 (number) 、 * 名称 (name) 、价格 (price) 、折扣 (discount)4 项信息,根据表 9-1 ,为这些信 息选择合适的数据类型。 * (2)建立 2个函数,以实现对商品的操作。 input 函数实现商品的输入; * display 函数显示商品信息。要求这 2个函数都以商品的结构体 (PRODUCT) 指针为 参数。 * (3 )在主函数中为商品键盘定义一个结构体变量 (keyboard) ,利用 input 函数实现键 盘信息的输入; * 定义一个结构体数组 (elec_device[3]) ,利用 input 函数实现冰箱、 空调、电视 信息的输入; * 最后利用 display 函数显示 4 种商品的信息。 * * 表 9-1 #include typedef struct _PRODUCT int iNumber; char strName[32]; float fPrice; float fDiscount; * 编号 名称 价格 折扣 *1010 键盘 89.50 0.85 *1021 冰箱 1024.00 0.95 *1022 空调 2058.50 0.90 *1023 电视 3001.88 0.95 *************************************************************** */

c语言结构体指针初始化===

c语言结构体指针初始化 今天来讨论一下C中的内存管理。 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以前做二叉树算法时,他的左右孩子指针使用时难道有初始化吗 那时我不知怎么的想不出理由,虽然我还是坚信要初始化的 过了几天这位同事说他试了一下,结构体中的成员指针不经过初始化是可以用(左子树和右子树指针) 那时在忙着整理文档,没在意 今天抽空调了一下,结论是,还是需要初始化的。 而且,不写代码你是不知道原因的(也许是对着电脑久了IQ和记性严重下跌吧) 测试代码如下 1.#include 2.#include 3.#include 4. 5.struct student{ 6.char *name; 7.int score; 8.struct student* next; 9.}stu,*stu1; 10. 11.int main(){ 12. https://www.doczj.com/doc/cc6809546.html, = (char*)malloc(sizeof(char)); /*1.结构体成员指针需要初始化*/ 13. strcpy(https://www.doczj.com/doc/cc6809546.html,,"Jimy"); 14. stu.score = 99; 15. 16. stu1 = (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/ 17. stu1->name = (char*)malloc(sizeof(char));/*3.结构体指针的成员指针同样需要初始化*/ 18. stu.next = stu1; 19. strcpy(stu1->name,"Lucy"); 20. stu1->score = 98; 21. stu1->next = NULL; 22. printf("name %s, score %d \n ",https://www.doczj.com/doc/cc6809546.html,, stu.score); 23. printf("name %s, score %d \n ",stu1->name, stu1->score); 24. free(stu1); 25.return 0; 26.} #include #include #include struct student{ char *name; int score; struct student* next; }stu,*stu1; int main(){ https://www.doczj.com/doc/cc6809546.html, = (char*)malloc(sizeof(char)); /*1.结构体成员指针需要初始化*/ strcpy(https://www.doczj.com/doc/cc6809546.html,,"Jimy"); stu.score = 99; stu1 = (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/ stu1->name = (char*)malloc(sizeof(char));/*3.结构体指针的成员指针同样需要初始化*/ stu.next = stu1; strcpy(stu1->name,"Lucy"); stu1->score = 98; stu1->next = NULL; printf("name %s, score %d \n ",https://www.doczj.com/doc/cc6809546.html,, stu.score);

C语言实验课题目

目录 实验1 输入输出 (2) 实验2 选择语句 (4) 实验3 循环语句 (5) 实验4 函数 (6) 实验5 指针 (8) 实验6 数组 (9) 实验7 结构体 (10)

实验1 输入输出 要求掌握: 1、VC++平台的使用; 2、C源程序的建立、保存、编译和运行; 3、变量的定义、赋值和运算; 4、printf函数的使用; 5、scanf函数的使用; 6、int、long、float、double、unsigned的含义; 7、关键字、预定义标识符和用户标识符的区别; 8、自加自减运算符的使用。 完成下列题目: 1. 键盘输入与屏幕输出练习 问题1 要使下面程序的输出语句在屏幕上显示1, 2, 34,则从键盘输入的数据格式应为以下备选答案中的。 #include main() { char a,b; int c; scanf("%c%c%d",&a,&b,&c); printf("%c,%c,%d\n",a,b,c); } A)1 2 34 B)1, 2, 34 C)’1’,’2’,34D)12 34 问题2 在与上面程序的键盘输入相同的情况下,要使上面程序的输出语句在屏幕上显示12 34,则应修改程序中的哪条语句?怎样修改? 问题 3 要使上面程序的键盘输入数据格式为1,2,34,输出语句在屏幕上显示的结果也为1,2,34,则应修改程序中的哪条语句?怎样修改? 问题4 要使上面程序的键盘输入数据格式为1,2,34,而输出语句在屏幕上显示的结果为'1', '2',34,则应修改程序中的哪条语句?怎样修改? [提示:利用转义字符输出字符单引号字符。]

二级C语言结构体定义及应用部分练习题(十三)(精)

(1)有以下程序段 typedef struct NODE { int num; struct NODE *next; } OLD; 以下叙述中正确的是C A)以上的说明形式非法 B)NODE是一个结构体类型 C)OLD是一个结构体类型 D)OLD是一个结构体变量(2)若有以下说明和定义union dt { int a; char b; double c; }data; 以下叙述中错误的是 C A)data的每个成员起始地址都相同 B)变量data所占内存字节数与成员c所占字节数相等 C)程序段:data.a=5;printf("%f\n",data.c);输出结果为5.000000 D)data可以作为函数的实参(3)设有如下说明 typedef struct ST { long a; int b; char c[2]; } NEW; 则下面叙述中正确的是 C A)以上的说明形式非法 B)ST是一个结构体类型 C)NEW是一个结构体类型 D)NEW是一个结构体变量(4)以下对结构体类型变量td的定义中,错误的是 C A)typedef struct aa { int n; float m; }AA; AA td; B)struct aa { int n; float m; } td; struct aa td; C)struct { int n; float m; }aa; struct aa td; D)struct { int n; float m; }td; (5)设有以下语句 typedef struct S { int g; char h;} T; 则下面叙述中正确的是B A)可用S定义结构体变量 B)可以用T定义结构体变量 C)S是struct类型的变量 D)T是struct S类型的变量(6)设有如下说明 typedef struct { int n; char c; double x;}STD; 则以下选项中,能正确定义结构体数组并赋初值的语句是B A)STD tt[2]={{1,'A',62},{2, 'B',75}}; B) STD tt[2]={1,"A",62},2, "B",75}; C) struct tt[2]={{1,'A'},{2, 'B'}}; D)structtt[2]={{1,"A",62.5},{2, "B",75.0}}; (7)设有以下说明语句 typedef struct { int n; char ch[8]; }PER; 则下面叙述中正确的是B A) PER 是结构体变量名 B) PER是结构体类型名 C) typedef struct 是结构体类型 D)struct 是结构体类型名(8)设有以下说明语句 struct ex { int x ; float y; char z ;} example; 则下面的叙述中不正确的是B A) struct结构体类型的关键字 B)example是结构体类型名 C) x,y,z都是结构体成员名 D) struct ex是结构体类型(9)有如下定义 struct person{char name[9]; int age;}; strict person class[10]={“Johu”, 17, “Paul”, 19 “Mary”, 18, “Adam 16,}; 根据上述定义,能输出字母M的语句是D A) prinft(“%c\n”,class[ 3].mane); B) pfintf(“%c\n”,class[3].name[1]); C) prinft (“%c\n”,class[2].n ame[1]); D) printf(“%^c\n”,class[2].name[0]); (10)变量a

动态内存分配(C语言)

实验报告 实验课程名称:动态内存分配算法 年12月1日

实验报告 一、实验内容与要求 动态分区分配又称为可变分区分配,它是根据进程的实际需要,动态地为之分配内存空间。在实验中运用了三种基于顺序搜索的动态分区分配算法,分别是1.首次适应算法2.循环首次适应算法3.最佳适应法3.最坏适应法分配主存空间。 二、需求分析 本次实验通过C语言进行编程并调试、运行,显示出动态分区的分配方式,直观的展示了首次适应算法循环首次适应算法、最佳适应算法和最坏适应算法对内存的释放和回收方式之间的区别。 首次适应算法 要求空闲分区链以地址递增的次序链接,在分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止,然后在按照作业的大小,从该分区中划出一块内存空间,分配给请求者,余下的空余分区仍留在空链中。 优点:优先利用内存中低址部分的空闲分区,从而保留了高址部分的大空闲区,为以后到达的大作业分配大的内存空间创造了条件。 缺点:低址部分不断被划分,会留下许多难以利用的、很小的空闲分区即碎片。而每次查找又都是从低址部分开始的,这无疑又会增加查找可用空闲分区时的开销。

循环首次适应算法 在为进程分配内存空间时,不是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲分区。 优点:该算法能使内存中的空闲分区分布得更均匀,从而减少了查找空闲分区时的开销。 最佳适应算法 该算法总是把能满足要求、又是最小的空闲分区分配给作业,避免大材小用,该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。 缺点:每次分配后所切割下来的剩余部分总是最小的,这样,在存储器中会留下许多难以利用的碎片。 最坏适应算法 最坏适应算法选择空闲分区的策略正好与最佳适应算法相反:它在扫描整个空闲分区或链表时,总会挑选一个最大的空闲区,从中切割一部分存储空间给作业使用。该算法要求,将所有的空闲分区,按其容量以大到小的顺序形成一空闲分区链。查找时,只要看第一个分区能否满足作业要求即可。 优点:可使剩下的空闲区不至于太小,产生碎片的可能性最小,对中小作业有利,同时,最坏适应算法查找效率很高。 缺点:导致存储器中缺乏大的空闲分区 三、数据结构 为了实现动态分区分配算法,系统中配置了相应的数据结构,用以描述空闲分区和已分配分区的情况,常用的数据结构有空闲分区表和空闲分区链 流程图

C语言中结构体的使用

脚踏实地,心无旁骛,珍惜分分秒秒。紧跟老师,夯实基础。 什么是结构体? 简单的来说 结构体就是一个可以包含不同数据类型的一个结构 它是一种可以自己定义的数据类型 它的特点和数组主要有两点不同 首先结构体可以在一个结构中声明不同的数据类型 第二相同结构的结构体变量是可以相互赋值的 而数组是做不到的 因为数组是单一数据类型的数据集合 它本身不是数据类型(而结构体是) 数组名称是常量指针 所以不可以做为左值进行运算 所以数组之间就不能通过数组名称相互复制了 即使数据类型和数组大小完全相同 定义结构体使用struct修饰符 例如: struct test { float a; int b; }; 上面的代码就定义了一个名为test的结构体 它的数据类型就是test 它包含两个成员a和b 成员a的数据类型为浮点型 成员b的数据类型为整型 由于结构体本身就是自定义的数据类型 定义结构体变量的方法和定义普通变量的方法一样 test pn1; 这样就定义了一test结构体数据类型的结构体变量pn1 结构体成员的访问通过点操作符进行 pn1.a=10 就对结构体变量pn1的成员a进行了赋值操作 注意:结构体生命的时候本身不占用任何内存空间 只有当你用你定义的结构体类型定义结构体变量的时候计算机才会分配内存

结构体 同样是可以定义指针的 那么结构体指针就叫做结构指针 结构指针通过->符号来访问成员 下面我们就以上所说的看一个完整的例子: #include #include using namespace std; struct test//定义一个名为test的结构体 { int a;//定义结构体成员a int b;//定义结构体成员b }; void main() { test pn1;//定义结构体变量pn1 test pn2;//定义结构体变量pn2 pn2.a=10;//通过成员操作符.给结构体变量pn2中的成员a赋值 pn2.b=3;//通过成员操作符.给结构体变量pn2中的成员b赋值 pn1=pn2;//把pn2中所有的成员值复制给具有相同结构的结构体变量pn1 cout<a=99;//通过结构指针修改结构体变量pn2成员a的值 cout<a<<"|"<b<

c语言结构体心得体会

c语言结构体心得体会 c语言学习心得体会一c语言作为一种计算机的语言,我们学习它,有助于我们更好的了解计算机,与计算机进行交流,因此,c语言的学习对我们尤其重要。 在这个星期里,我们专业的学生在专业老师的带领下进行了c语言程序实践学习。在这之前,我们已经对c语言这门课程学习了一个学期,对其有了一定的了解,但是也仅仅是停留在了解的范围,对里面的好多东西还是很陌生的在运用起来的时候还是感到很棘手,毕竟,万事开头难嘛。 由于时间的关系,我们的这次实践课程老师并没有给我们详细的介绍,只是给我们简单的介绍了几个比较重要的实际操作。包括了程序模块处理。简单界面程序。高级界面程序。程序的添加修改。用程序做一元线性回归处理以及用c 语言程序来画粒度分布图等这几样比较重要的时间操作。 上机实验是学习程序设计语言必不可少的实践环节,特别是c语言灵活、简洁,更需要通过编程的实践来真正掌握它。对于程序设计语言的学习目的,可以概括为学习语法规定、掌握程序设计方法、提高程序开发能力,这些都必须通过充分的实际上机操作才能完成。 c语言学习心得体会二C语言是在国内外广泛使用的一种计算机语言。其语言功能丰富、表达能力强、使用灵活方便、既具有高级语言的优点,又具有低级语言的许多特

点,适合编写系统软件。其功能强大,不仅用在计算机上广泛用在电子,机械等方面上,而且,所有的windows,Unix,Linux,Mac,os/2,无一例外,哪一个不是C 语言写的?很多新型的语言如,C++,Java,C#,J#,perl... 都是衍生自C语言。掌握了C语言,可以说你就掌握了很多门语言。 学习C程序这门课一年了,这是我们学的第一门专业课,在大学里C语言不但是计算机专业的必修课程而且也是非计算机专业学习计算机基础的一门必修课程。所以作为我这个计算机专业的学生来说当然十分重要,老师在第一节课说过,C语言是计算机的基础,大多数软件都需要用C语言来编写,通过一个年的学习,使我由初步掌握简单的应试知识到完成高难度的深入编程,如我们在编写一个较大的程序时应该把它分开成几个小程序来看,这样会容易得多。同时,我觉得 C语言应该是操作和理论相结合的课程,在不断地编写中去思考,两者是不可分割的。 在学习一年C语言的过程中我也在慢慢探索怎样才能学好C语言,并总结了一点经验: 要了解C语言就要从语法基础来学习起,首先要是要了解它的结构,比如变量,首先要了解变量的定义方式(格式),其意义是什么(定义变量有什么用); 其次就是要我要怎么去运用它(我要用什么型式去应用

C语言程序设计课程实验题目.

C语言程序设计课程实验题目 (每组实验内容2学时) 实验一C语言上机步骤 实验目的:熟练掌握在Turbo C系统上编辑、编译、连接和运行C程序的方法。 实验内容: 1.启动Turbo C系统。 ①进入MS-DOS方式。 ②CD\TC↙ ③TC↙ 2. 编辑修改源程序。 ①按“F3”,然后输入:exam↙(默认文件名为“NONAME.C”) ②输入下列源程序。 main() { int a,b,sum; a=1;b=2;sum=a+b; printf("sum=%d\n",sum); } ③源程序存盘。 方法一:按“F2”键,将以源文件名存盘。 方法二:选取菜单项“File/Write To”,将以新文件名存盘。

3.编译连接程序。 方法一:编译、连接分步执行。 按“Alt+F9”键,编译生成目标文件“exam.obj”;再按“F9”,连接生成可执行文件“exam.exe” 方法二:编译、连接连续执行。 按“F9”键,首先编译生成目标文件“exam.obj”;接着自动连接生成可执行文件“exam.exe” 4.运行程序。 方法一:编辑状态下,按“Ctrl+F9”键,此时是编译、连接、运行连续进行。 方法二:按“Alt+X”键,然后输入:exam↙(必须编译、连接成功)。 5.显示运行结果。 若按方法一运行程序,按“Alt+F5”键,查看运行结果,按任意键返回到Turbo C编辑状态。若按方法二运行程序,直接显示结果。 6.退出。 按“Alt+x”键,退出Turbo C。 实验二运算符和表达式 实验目的:掌握C语言运算符的优先级和结合方向。 实验内容: 1.若有定义int x,a,b,c,*p=&x;,写出顺序执行下列表达式后x的值,然后通过程序验证。 要求:先写出运算结果,然后利用程序验证。

相关主题
文本预览
相关文档 最新文档