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

C++学习之内存管理、复合类型、文件

一.内存管理

1.作用域(上)

2.作用域(下)

3.内存四区

//#define _CRT_SECURE_NO_WARNINGS
//#include<stdio.h>
//#include<string.h>
//#include<stdlib.h>
//
全局变量  数据区  初始化会放在data
//int g_a = 10;
//int g_b = 20;
//
全局常量
//const int g_c_a = 10;
//const int g_c_b = 20;
//
//int main()
//{
//    //局部变量  栈区
//    int a = 10;
//    int b = 20;
//
//    //打印地址
//    printf("%u\n", &a);
//    printf("%u\n", &b);
//
//    printf("%u\n", &g_a);
//    printf("%u\n", &g_b);
//
//    static int s_a;  //未初始化 放在 bss
//    static int s_b;
//    printf("%u\n", &s_a);
//    printf("%u\n", &s_b);
//
//    //数据区 中的常量区
//    printf("%u\n", &"hello world");
//    printf("%u\n", &"hello world1");
//
//    //局部常量  栈
//    const int c_a = 10;
//    const int c_b = 20;
//    printf("%u\n", &c_a);
//    printf("%u\n", &c_b);
//
//
//    //全局常量  数据区 常量区
//    printf("%u\n", &g_c_a);
//    printf("%u\n", &g_c_b);
//
//    //堆区
//    char * ch =  malloc(64);
//    printf("堆区: %u\n", ch);
//
//    system("pause");
//    return EXIT_SUCCESS;
//}

4.memset

5.10内存管理_04mencpy

//#define _CRT_SECURE_NO_WARNINGS
//#include<stdio.h>
//#include<string.h>
//#include<stdlib.h>
//
//void test01()
//{
//    //memcpy 可以拷贝数组
//    int arr1[5] = { 0 };
//    int arr2[5] = { 1,2,3,4,5 };
//
//    memcpy(arr1, arr2, sizeof(arr2));
//
//    for (int i = 0; i < 5; i++)
//    {
//        printf("%d\n", arr1[i]);
//    }
//}
//
//void printString(char* arr, int num)
//{
//    for (int i = 0; i < num; i++)
//    {
//        printf("%c", arr[i]);
//    }
//    printf("#\n");
//}
//
//void test02()
//{
//    char str1[64] = { 0 };
//    char str2[64] = "hello\0world";
//    strcpy(str1, str2);
//    printString(str1,sizeof(str1));
//
//    memset(str1, 0, sizeof(str1));
//    memcpy(str1, str2, sizeof(str2));
//    printString(str1, sizeof(str1));
//}
//
//int main()
//{
//    test02();
//
//
//    system("pause");
//    return EXIT_SUCCESS;
//}

6.10内存管理_05_menmmove

7.10内存管理_06_mamcmp

8.10内存管理_07_malloc

9.10内存管理_08_malloc案例_动态数组

10.10内存管理_09_内存操作易错点

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//1、返回局部变量的地址
int* func()
{
    int a = 10;
    return &a;
}
void test01()
{
    int* p = func();
    printf("*p = %d\n", *p); //由于vs保护了数据,所以返回的第一次的时候可以成功接受
    printf("*p = %d\n", *p);
}

//可以返回静态局部变量的地址
int* func2()
{
    static int a = 10;
    return &a;
}
void test02()
{
    int* p = func2();
    printf("*p = %d\n", *p);
    printf("*p = %d\n", *p);
    printf("*p = %d\n", *p);
    printf("*p = %d\n", *p);
    printf("*p = %d\n", *p);
}


//2、不要操作释放的空间
void test03()
{
    int * p = malloc(sizeof(int));
    *p = 1000;
    printf("*p = %d\n", *p);
    free(p);

    printf("*p = %d\n", *p); //p指向的内存已经被释放了,再次访问属于非法行为
}


//3、不要重复释放同一段内存
void test04()
{
    int* p = malloc(sizeof(int));
    *p = 1000;
    printf("*p = %d\n", *p);
    //free(p);
    //p = NULL;
    //free(p);  //error 堆区内存重复释放,是错误的,解决方式,释放过后将指针置空

    if (p != NULL)
    {
        free(p);
        p = NULL;
    }

    if (p != NULL)
    {
        free(p);
        p = NULL;
    }
}

//4、同级指针修饰内存失败

void allocateMemory(int* p1)
{
    p1 = malloc(sizeof(int));
}

//解决方式1 :利用函数返回值
int * allocateMemory2()
{
    int * p1 = malloc(sizeof(int));
    return p1;
}
//解决方式2 :利用高级指针修饰低级指针
void allocateMemory3(int** p1)
{
    *p1 = malloc(sizeof(int));
}

void test05()
{
    int* p = NULL;
    //allocateMemory(p); //同级指针修饰失败
    //p = allocateMemory2();  //解决方式1 成功
    allocateMemory3(&p);      //解决方式2 成功
    *p = 100;
    printf("*p = %d\n", *p);
    free(p);
}

int main()
{
    test05();


    system("pause");
    return EXIT_SUCCESS;
}

二.复核类型

1.复核类型_01_结构体定义和创建

//#define _CRT_SECURE_NO_WARNINGS
//#include<stdio.h>
//#include<string.h>
//#include<stdlib.h>
//
结构体的定义和创建
定义语法:struct 结构体名 { 成员列表 };
举例:定义学生结构体
//struct student
//{
//    //int id = 1; //学号    定义结构体成员时候不可以给初始值
//    int id; //学号
//    char name[64]; //姓名
//    int age; //年龄
//}s3, s4 = {2,"Jerry",20};
//
//int main()
//{
//
//    //结构体变量的创建
//    //语法:struct 结构体名称 变量名
//    struct student s1;
//    struct student s2 = { 1,"Tom",18 };
//
//    system("pause");
//    return EXIT_SUCCESS;
//}

2.复核类型_02_结构体成员访问和赋值

3.复核类型_03_结构体数组

4.复核类型_04_结构体数组排序

5.复核类型_05_结构体嵌套结构体

6.复核类型_06_结构体指针

7.复核类型_07_结构体与堆栈

8.复核类型_08_结构体做函数参数

9.复核类型_09_结构体案例_结构体嵌套一级指针

10.复核类型_10_const修饰结构体指针

11.复核类型_11_联合体

12.复核类型_12_枚举

三.文件

1.文件的基本概念

2.文件指针

3.文件打开和关闭

4.字符方式读写文件

5.字符读写文件案例

6.文本文件和二进制文件区别

7.行方式读写文件

8.行读写文件案例(上)

9.行读写文件案例(下)

10.格式化读写文件

11.格式化读写文件案例

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>

//写文件 随机数.txt
void test01()
{
    srand((unsigned int)time(NULL));
    FILE* fp = fopen("随机数.txt", "w");
    if (fp == NULL)
    {
        printf("文件打开失败\n");
        return;
    }

    for (int i = 0; i < 100; i++)
    {
        //1到1000的随机数
        fprintf(fp, "%d\n", rand() % 1000 + 1);
    }

    fclose(fp);
    printf("随机数生成完毕\n");
}

void bubbleSort(int arr[], int n)
{
    for (int i = 0; i < n - 1; i++)
    {
        for (int j = 0; j < n - i - 1; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }

}

//读取文件 随机数.txt  排序  写入到 有序数.txt 中
void test02()
{
    int arr[100] = { 0 };

    FILE* fp = fopen("随机数.txt", "r");
    if (fp == NULL)
    {
        printf("文件打开失败\n");
        return;
    }

    for (int i = 0; i < 100; i++)
    {
        fscanf(fp, "%d\n", &arr[i]);
    }

    fclose(fp);

    //排序 升序
    bubbleSort(arr, 100);

    //测试
    //for (int i = 0; i < 100; i++)
    //{
    //    printf("%d\n", arr[i]);
    //}

    //写入到文件 有序数.txt
    fp = fopen("有序数.txt", "w");
    if (fp == NULL)
    {
        printf("文件打开失败\n");
        return;
    }

    for (int i = 0; i < 100; i++)
    {
        fprintf(fp, "%d\n", arr[i]);
    }

    fclose(fp);
}

int main()
{

    //test01();
    test02();

    system("pause");
    return EXIT_SUCCESS;
}

12.块方式读写文件

13.文件定位

14.系统文件指针

15.文件状态

16.文件的重命名与删除

17.比赛成绩管理系统_01_系统需求

18.比赛成绩管理系统_02_添加菜单界面

19.比赛成绩管理系统_03_用户交互及退出

20.比赛成绩管理系统_04_添加新的记录

21.比赛成绩管理系统_05_查看往届记录

22.比赛成绩管理系统_06_清空往届记录

23.比赛成绩管理系统_07_检测空文件


http://www.mrgr.cn/news/92894.html

相关文章:

  • (保姆级教程)Windows系统本地部署通义万相2.1视频生成模型
  • pt-archiver删除数据库的数据表/各种报错类型
  • 制造业中的“大数据”:如何实现精准决策?
  • 《UE5_C++多人TPS完整教程》学习笔记33 ——《P34 关卡与大厅之间的过渡(Transition Level And Lobby)》
  • Java实现pdf文件压缩(aspose-pdf实现压缩、itextpdf去除aspose-pdf版权水印)
  • cuda-12.4.0 devel docker 中源码安装 OpenAI triton
  • 代码随想录算法训练营第三十天 | 卡码网46.携带研究材料(二维解法)、卡码网46.携带研究材料(滚动数组)、LeetCode416.分割等和子集
  • 自然语言处理:文本表示
  • Linux系统服务安全检测手记
  • 本地搭建Ollama运行各种平台的大模型(deepseek),配合AnythingLLM-UI界面使用
  • 【漫话机器学习系列】111.指数之和的对数(Log-Sum-Exp)
  • 动态规划多阶段报童模型,c++ 实现, java 实现
  • yolov8,yolo11,yolo12 服务器训练到部署全流程 笔记
  • Verilog:I2C控制器
  • 【RAG】Embeding 和 Rerank学习笔记
  • Excel基础(详细篇):总结易忽视的知识点,有用的细节操作
  • 基因枷锁下的太空梦 —— 千钧一发电影观后感
  • (原创)用python语言基于paddleocr构建批量识别实现纸质和电子的增值税专用发票程序
  • 【漫话机器学习系列】112.逻辑回归(Logistic Regression)
  • Linux tar命令