当前位置: 首页 > 编程日记 > 正文

再识C中的结构体

在前面认识C中的结构体中我介绍了结构体的基础知识,下面通过这段代码来回顾一下:

 1 #include<stdio.h>
 2 #define LEN 20
 3 
 4 struct Student{            //定义结构体
 5     char name[LEN];
 6     char address[LEN];
 7     int age;
 8 };
 9 
10 int main(int argc, char* argv[])
11 {
12     struct Student s = {        //初始化
13         "bluemsun","NENU",25
14     };    
15     
16     struct Student * p;            //定义一个指向结构体的指针
17     p = &s;                        //为指针赋值
18 
19     printf("s.name = %s,s.address = %s,s.age = %d\n",s.name,s.address,s.age);
20     printf("p->name = %s,p->address = %s,p->age = %d\n",p->name,p->address,p->age);    
21 }

这是一个比较简单的例子程序,在结构体Student中我们定义两个char数组,现在来考虑这样一个问题。我们在平时需要使用数组的时候都是可以用指针代替数组作为参数使用,那么在上面的程序中能否用下面这段代码代替结构体的定义呢?

1 struct new_Student{            //定义结构体
2     char * name;
3     char * address;
4     int age;
5 };

答案是肯定的,但是可能会遇到一些麻烦。考虑下面一段代码:

1 struct new_Student s1 = {"zhouxy","EFGH",25};    
2 struct Student s2 = {"bluemsun","ABCD",26};    

这段代码是正确的。但是想想其中的字符串存储在哪里?对于struct Student变量s2来说,字符串存储在结构内部,这个结构总共分配了40个字节来存储两个字符串。然而对于new_Student变量s1来说,字符串是存放在编译器存储字符串常量的任何地方。new_Student结构中仅仅是存放了两个地址而已。所以如果需要一个结构来存放字符串,请使用字符数组成员。那么是不是采用指针的方式就真的不能完成内存的分配呢?答案是否定的。在这里我讲解了关于C中的函数malloc(),这个函数是可以在运行期动态分配内存的。所以如果能结合在这里来使用,那就达到了我们的设想了。考虑下面这段代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 
 5 struct new_Student{            //定义结构体
 6     char * name;
 7     char * address;
 8     int age;
 9 };
10 
11 int main(int argc, char* argv[])
12 {
13     char str[] = "zhouxy";
14     struct new_Student s1;    
15     //分配用来存放名字的内存
16     s1.name = (char*)malloc(strlen(str)+1);
17     //把名字复制到已分配的内存中
18     strcpy(s1.name,str);
19     
20     printf("s1.name = %s\n",s1.name);
21 }

上面代码是正确的,我们用malloc()函数分配存储空间,然后把字符串复制到新分配的空间。这里要理解的是:name字符串不是被存储在结构中,而是被保存在由malloc()函数管理的内存中。结构中仅仅是保存了name字符串的地址而已。还有一点要记得的是:我们使用malloc()函数分配内存之后要调用free()函数,不然可能会引起"内存泄露"。

转载于:https://www.cnblogs.com/zhouxuanyu/p/4514754.html

相关文章:

《妙解Hibernate 3.X》读书笔记一-Hibernate概述及环境搭建

很早就想开始Hibernate的系统学习&#xff0c;但是一是工作原因&#xff0c;二是苦于找不到合适的书籍。Hibernate更新较快&#xff0c;一些被称为经典的书籍&#xff0c;如<深入浅出Hibernate>、《Hibernate实战》等都过于年老&#xff0c;介绍的为Hibernate2.1&#xf…

ssm框架实现学生成绩管理系统

学习ssm框架&#xff0c;写的一个小项目&#xff0c;参考 实现的功能有&#xff1a;学生信息增删改查&#xff0c;成绩信息查询&#xff0c;修改&#xff0c;求平均值&#xff0c; 附上链接&#xff0c;欢迎下载 git clone https://gitee.com/LOL_toulan/SpringBootProject.gi…

如何查找特定目录下最大的文件及文件夹

如何查看特定目录下大小在前10位的文件 find 目录 -ls |sort -nrk7 |head 参数说明如下&#xff1a; -ls True; list current file in ls -dils format on standard output. 没加-ls之前&#xff0c;输出的只是文件名&#xff0c;类似于 /u01/app/oracle/oradata/test/…

LightOJ 1364 Expected Cards(概率+DP)

题目链接&#xff1a;http://lightoj.com/volume_showproblem.php?problem1364 题意&#xff1a;一副牌。依次在桌面上放牌。求放了四种花色的牌为C,D,H,S张时放的牌数的期望。大小王出现时必须将其指定为某种花色。指定时要使最后的期望最小。 思路&#xff1a;DP&#xff0c…

会计科目中英文对照表

现金 Cash in hand 银行存款 Cash in bank 其他货币资金-外埠存款Other monetary assets - cash in other cities 其他货币资金-银行本票 Other monetary assets - cashier‘s check 其他货币资金-银行汇票 Other monetary assets - bank draft 其他货币资金-信用卡 Other…

关于get和post两种提交方式

Get请求&#xff1a; 1.可携带的数据量小 2.只能存放字符串类型的数据&#xff0c;不能存放bean对象 3.安全性差&#xff0c;例如如果在登录上使用get请求&#xff0c;在地址栏中会显 示输入的username和password 4.客户端在接收到get请求后&#xff0c;浏览器会自动的缓存响应…

数据库原理与设计 P75作业 学号2013211466 班级0401302

习题5 2. (1)写出关系模式&#xff1a; 学生:R1 U1{学号,姓名,出生日期,系名,班号,宿舍区}; F1{学号->(姓名,出生日期,系名,班号,宿舍区)&#xff0c;班号->系名&#xff0c;系名->宿舍区}&#xff1b; 班级:R2 U2{班号,专业名,系名,人数,入校年份}; F2{班号->(专业…

Windows DDK介绍,选择和安装

windows的文档工作还是非常不错的&#xff0c;所有的信息都可以从windows DDK主页和DDK自带的帮助文档中获得&#xff0c;本文只是一个总结。 今天开始正式接触DDK&#xff0c;首先来到DDK主页&#xff0c;有如下信息有用&#xff1a; 1. 选择安装什么版本的DDK。目前DDK的推荐…

关于jsp基础知识题目(一)

1.为了标识一个HTML文件&#xff0c;应该使用标记 html 2.form表单中提交数据的目的地址的属性是 action 3.关于post&#xff1a;安全性较好&#xff0c;地址栏看不到提交的数据&#xff0c;超链接标识post提交方式&#xff0c;可以传输大量数据 4.表单的提交方式有 2 种 5…

GO环境变量设置

GOROOT就是go的安装路径在~/.bash_profile中添加下面语句: GOROOT/usr/local/go export GOROOT 当然, 要执行go命令和go工具, 就要配置go的可执行文件的路径:操作如下:在~/.bash_profile中配置如下:export $PATH:$GOROOT/bin如果是windows需要使用;符号分割两个路径, mac和类un…

Camera+销量突破200万 创始人分享成功经验

Camera 突破了200万份销量大关&#xff0c;开发商tap tap tap分享了成功经验。 创始人John Casasanta指出&#xff0c;他们花了6个多月实现销量突破100万大关&#xff0c;而接下来3个月就销售了200万份&#xff0c;照这个趋势下去&#xff0c;300万销售大关也许只需要1个半月。…

计算机组成原理习题(一)

1.计算机系统包括&#xff1a;硬件系统和软件系统 2.计算机的软件系统包括&#xff1a;系统软件和应用软件 3.冯诺依曼计算机的核心思想是&#xff1a;存储程序 4.计算机的五大功能部件&#xff1a;运算器&#xff0c;控制器&#xff0c;存储器&#xff0c;输入设备&#xf…

HTML中常见的各种位置距离以及dom中的坐标讨论

最近在学习JavaScript&#xff0c;特意买了一本犀牛角书来看看&#xff0c;尼玛一千多页&#xff0c;看的我头昏脑涨&#xff0c;翻到DOM这章节&#xff0c;突然记起平常在使用DOM时&#xff0c;碰到了好多的这个dom里面的各种宽度&#xff0c;高度&#xff0c;特意在此写一写&…

快速掌握Python的捷径-Python基础前传(1)

文&#xff1a; jacky(朱元禄) 开文序 最近看新闻&#xff0c;发现高考都考Python了&#xff0c;随着人工智能的火热&#xff0c;学数据科学的人越来越多了&#xff01;但对于数据行业本身来说&#xff0c;现象级的火热&#xff0c;这并不是什么好事。 方丈高楼平地起&#xf…

jsp实现日历

在JSP程序中使用各种脚本元素和标签实现具体的功能 <%--Created by IntelliJ IDEA.User: asusDate: 2020/2/25Time: 21:39To change this template use File | Settings | File Templates. --%> <% page contentType"text/html;charsetUTF-8" language&quo…

小胖妞洗发水广告

觉得自己的博客可能太严肃了&#xff0c;都是技术文章&#xff0c;书评&#xff0c;鸡汤呀&#xff0c;来点稍微轻松点。虽然自己都不敢直视一年前的小胖妞跳的舞蹈&#xff0c;不过现在更胖。 权且娱乐下&#xff0c;也当留个纪念~ http://v.youku.com/v_show/id_228708395.ht…

Yii2.0 RESTful API 之版本控制

Yii2.0 RESTful API 之版本控制 之前我写过两篇关于 Yii2.0 RESTful API 如何搭建&#xff0c;以及 认证 等处理&#xff0c;但是没有涉及到版本管理&#xff0c;今天就来谈谈版本管理如何实现。 索性就从头开始一步一步搭建吧&#xff0c;但是关于一些概念以及使用本篇就不一一…

ssl 和 https

SSL (Secure Socket Layer) 为Netscape所研发&#xff0c;用以保障在Internet上数据传输之安全&#xff0c;利用数据加密(Encryption)技术&#xff0c;可确保数据在网络上之传输过程中不会被截取及窃听。目前一般通用之规格为40 bit之安全标准&#xff0c;美国则已推出128 bit之…

jsp实现日历(二)

<% page contentType"text/html;charsetUTF-8" language"java" %> <% page import"java.util.Calendar" %> <html> <head><title>日历</title><style>table{border: none;}table caption{color: red;…

Java微信公众平台开发(十)--微信自定义菜单的创建实现

转自&#xff1a;http://www.cuiyongzhi.com/post/48.html 自定义菜单这个功能在我们普通的编辑模式下是可以直接在后台编辑的&#xff0c;但是一旦我们进入开发模式之后我们的自定义菜单就需要自己用代码实现&#xff0c;所以对于刚开始接触的人来说可能存在一定的疑惑&#x…

【经典算法】快速排序

与归并排序一样&#xff0c;快速排序使用也使用了分治的思想。下面是对一个典型的子数组A[p,...,r]进行快速排序的三步分治过程&#xff1a; 分解&#xff1a;数组A[p,...,r]被划分成两个&#xff08;可能为空&#xff09;子数组A[P,...,q-1]和A[q1,...,r]&#xff0c;使得A[p,…

.Net 中如何测试静态方法

大部分Mokc框架是不支持mock静态方法的&#xff0c;那我们如何测试静态方法呢&#xff1f; 下面这个类包含了一个静态方法&#xff1a; public class MyHelper {public static string GetHelp(){return "This is help";} } 这个类调用了上面的Helper类中的静态方法 p…

计组--习题--总线

计算机使用总线结构的主要优点是便于实现积木化&#xff0c;缺点是______ A、 地址信息、数据信息和控制信息不能同时出现 B、 地址信息与数据信息不能同时出现 C、 两种信息源的代码在总线中不能同时传送 这里是引用 总线中地址线的作用是_______ A、 只用于选择存储器单元 B…

dispatch_queue_create(com.biostime.xxx, DISPATCH_QUEUE_SERIAL)的陷阱

代码 for(int i 0;i<10;i) { NSLog("i%d",i); dispatch_queue_t mySerialQueue dispatch_queue_create("com.biostime.xxx", DISPATCH_QUEUE_SERIAL); __block int d i; dispatch_async(mySerialQueue, ^{ …

详解Oracle安装与配置.

标签&#xff1a;Oracle 安装 配置 原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://enetq.blog.51cto.com/479739/316532 一.Oracle 简介. Oracle oracle是殷墟&#xff08;Yin Xu&#…

今天起,在广东可以用百度App一键报警!

今天&#xff0c;百度联合广东省公安厅上线了一款智能小程序&#xff1a;只要打开你手机里的百度 App 就能用了 &#xff01;在110实际接警的过程中&#xff0c;经常会遇到电话并不能很好地表达发生事件的地点等信息的情况&#xff0c;会耽误救援时间。因此&#xff0c;“广东1…

Spring 注解

1. Configuration Configuration用于定义配置类&#xff0c;可替换xml配置文件&#xff0c;被注解的类内部包含有一个或多个被Bean注解的方法&#xff0c;这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描&#xff0c;并用…

Junit的安装与使用

一、简介&#xff1a; JUnit是一个Java语言的单元测试框架。它由Kent Beck和Erich Gamma建立&#xff0c;逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个。 JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。Junit测试是程…

安装 ssh 的公开密匙到 iPhone 上

1). 在Mac的终端上产生密匙 ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/xxxx/.ssh/id_rsa): Created directory /home/xxxx/.ssh. Enter passphrase (empty for no passphrase): xxx Enter same passphrase again…

浏览器关闭事件处理

//有确认退出var msg_unload"您的文章内容还没有进行保存&#xff01;";var unloadConfirm {};unloadConfirm.SetConfirmMsg function(confirmMsg){ window.onBeforeUnload function(event) { event event || window.event; event.returnval…