当前位置: 首页 > news >正文

C_结构体学习_1

这里记录一下怎么为结构体成员变量实现内存连续且为动态
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
using namespace std;
// 今天描述结构体中的指针和数组
typedef struct _Player
{int level;char name[20];} Player, *PPplayer;
// 上面这个第一个结构体里面成员在内存中是连续的void fun1()
{PPplayer p1 = (PPplayer)malloc(sizeof(Player)); // 为p1申请内存memset(p1, 0, sizeof(Player));                  // 初始化p1->level = 1;strcpy(p1->name, "张三");cout << "p1->level:" << p1->level << endl;cout << "p1->name:" << p1->name << endl;free(p1);p1 = NULL;
}typedef struct _Player2
{int level;char *name; // name是一个指针} Player2, *PPplayer2;
// 上面这个结构体里面成员在内存中是不连续的
void fun2()
{PPplayer2 p2 = (PPplayer2)malloc(sizeof(Player2)); // 为p2申请内存memset(p2, 0, sizeof(Player2));                    // 初始化p2->level = 1;p2->name = (char *)malloc(strlen("1angx") + 1); // 为name申请内存,这里用了strlen()函数,最后的\x00的大小没有加上去,所以要加个1memset(p2->name, 0, 20);                        // 初始化strcpy(p2->name, "1angx");cout << "p2->level:" << p2->level << endl;cout << "p2->name:" << p2->name << endl;// free(p2->name);free(p2);p2 = NULL;
}typedef struct _Player3
{int level;char name[1]; // 这里给name的大小为1个字节,我们等会会在fun3函数中说明为何} Player3, *PPplayer3;void fun3()
{PPplayer3 p3 = (PPplayer3)malloc(sizeof(Player3) + strlen("1angx")); // 为p3申请内存,同时加上我们的name的大小,这里因为我们数组的大小是1所以不需要再加上1了memset(p3, 0, sizeof(Player3) + strlen("1angx"));                    // 初始化p3->level = 1;strcpy(p3->name, "1angx"); // 这里我们直接给name赋值是不是越界访问了,确实是,但是由于在结构体中内存是连续的,name在结构体中,我们的结构体的大小足够大,且level name的内存是连续的cout << "p3->level:" << p3->level << endl;cout << "p3->name:" << p3->name << endl;free(p3);p3 = NULL;puts("fun3中,我们就实现了内存连续,且大小为动态的name");puts("我们通过‘越界访问’实现了这一要求");
}int main()
{fun1(); // fun1中确实是利用数组实现了角色名称的创建,但是大小是固定的,不能动态改变putchar('\n');fun2(); // fun2中利用指针实现了角色名称的创建,大小是动态的,但是内存是不连续的putchar('\n');puts("那我们怎么实现大小是动态的,其在内存空间中的大小也是动态的?\n");puts("答案:fun3\n");fun3();return 0;
}

如有问题,欢迎纠错与讨论

http://www.hskmm.com/?act=detail&tid=39630

相关文章:

  • 嵌入式音频开发很好的博主
  • 实验3 C语言函数应用编程
  • 人工智能之编程基础 Python 入门:第一章 Python 的简介和安装
  • P5405 [CTS2019] 氪金手游 题解
  • 杂记选做 #1
  • 20232319 2025-2026-1 《网络与系统攻防技术》实验三实验报告
  • 2025.10.26 闲话-单位根反演
  • 题解:B4205 [常州市赛 2021] 特殊字符
  • 郭念海 - coder
  • 数据采集与融合技术实践第一次作业
  • ECC 学习笔记
  • 转化漏斗(随笔)
  • Halcon算法——区域生长
  • Windows11文件夹右键-删除多余选项-加快打开速度
  • 20231326《密码系统设计》第五周预习报告
  • 2025年实木家具厂家权威推荐榜:原木/全实木/北美黑胡桃/樱桃木/榫卯工艺/高端定制/全屋整装,烘干/白胚/木蜡油保养工艺深度解析
  • 2025年摘星搜荐怎么样:全面评测摘星AI的功能与优势
  • 实验 2
  • 2025 年 10 月系统门窗十大品牌榜单揭晓,技术研发实力与市场口碑深度解读
  • 【安卓】
  • 2025年TPU厂家权威推荐榜单:TPU加纤,TPU改性生产,专业定制与技术创新实力解析
  • 2025 年 10 月系统门窗十大品牌榜单揭晓,技术核心实力与市场口碑深度解读
  • 【万元奖金】第二届CCF算法能力大赛开始啦!名校云集、名企汇聚,免费参赛!
  • 切空间、切丛与收缩算子
  • 2025年仿石漆厂家推荐排行榜,外墙仿石漆,内墙仿石漆,防霉仿石漆,水包水仿石漆,水包砂仿石漆,耐污仿石漆,自洁仿石漆公司推荐
  • 2025年中央空调主机保养/维修/清洗/维保/维护公司推荐排行榜,水处理维保,物业公司/医院/写字楼/商场中央空调主机维保厂家精选
  • 变盲从为探索:专注听课,深耕实干
  • 2025年新风系统厂家权威推荐榜:电竞酒店/商场别墅/极寒地区全热交换新风系统专业解决方案
  • 2025 年 10 月系统门窗十大品牌榜单揭晓,技术研发实力与市场口碑全景剖析
  • 乱学点东西#1 :二进制警报器