C语言12 宏定义、内存

目录

宏定义(Macro Definition)

定义常量

宏函数

条件编译

内存管理

动态内存分配

文件操作

打开和关闭文件

读写文件

完整示例


宏定义(Macro Definition)

宏定义使用#define预处理指令来定义常量或宏函数。宏在预处理阶段进行替换,通常用于提高代码的可读性和简化重复性操作。

定义常量
#define PI 3.14
#define MAX_BUFFER_SIZE 1024
宏函数

宏函数可以用于定义简单的函数逻辑。

#define SQUARE(x) ((x) * (x))

int main() {
    int result = SQUARE(5);
    printf("Square of 5: %d\n", result); // 输出25
    return 0;
}
条件编译

使用条件编译指令可以根据条件选择性地编译代码段。

#ifdef DEBUG
    printf("Debug mode\n");
#endif

#ifndef MAX_BUFFER_SIZE
    #define MAX_BUFFER_SIZE 2048
#endif

#if MAX_BUFFER_SIZE > 1024
    printf("Buffer size is large\n");
#else
    printf("Buffer size is small\n");
#endif

内存管理

C语言提供了动态内存分配和释放的函数,通过这些函数可以在运行时申请和释放内存。动态内存管理主要使用以下函数:

动态内存分配
  • malloc(size_t size):分配指定大小的内存块,返回指向该内存块的指针。
  • calloc(size_t num, size_t size):分配并清零内存块,返回指向该内存块的指针。
  • realloc(void *ptr, size_t size):重新分配内存块的大小,返回指向新的内存块的指针。
#include <stdlib.h>

int main() {
    // 使用malloc分配内存
    int *arr = (int *)malloc(5 * sizeof(int));
    if (arr == NULL) {
        // 处理内存分配失败
        printf("Memory allocation failed\n");
        return 1;
    }

    // 使用calloc分配并清零内存
    int *arr2 = (int *)calloc(5, sizeof(int));
    if (arr2 == NULL) {
        // 处理内存分配失败
        printf("Memory allocation failed\n");
        return 1;
    }

    // 使用realloc重新分配内存
    arr = (int *)realloc(arr, 10 * sizeof(int));
    if (arr == NULL) {
        // 处理内存重新分配失败
        printf("Memory reallocation failed\n");
        return 1;
    }

    // 释放内存
    free(arr);
    free(arr2);

    return 0;
}

文件操作

C语言标准库提供了一组函数用于文件操作,包括打开、关闭、读写文件等。文件操作主要通过FILE指针和以下函数完成:

打开和关闭文件
  • fopen(const char *filename, const char *mode):以指定模式打开文件,返回指向FILE对象的指针。
  • fclose(FILE *stream):关闭文件。
FILE *file = fopen("example.txt", "w");
if (file == NULL) {
    printf("Failed to open file\n");
    return 1;
}
fclose(file);
读写文件
  • fwrite(const void *ptr, size_t size, size_t count, FILE *stream):将数据写入文件。
  • fread(void *ptr, size_t size, size_t count, FILE *stream):从文件读取数据。
  • fprintf(FILE *stream, const char *format, ...):格式化输出到文件。
  • fscanf(FILE *stream, const char *format, ...):从文件中格式化输入。
  • fgets(char *str, int n, FILE *stream):从文件中读取一行。
  • fputs(const char *str, FILE *stream):将字符串写入文件。
FILE *file = fopen("example.txt", "w");
if (file != NULL) {
    fprintf(file, "Hello, world!\n");
    fclose(file);
}

file = fopen("example.txt", "r");
if (file != NULL) {
    char buffer[100];
    while (fgets(buffer, 100, file) != NULL) {
        printf("%s", buffer);
    }
    fclose(file);
}

完整示例

下面是一个包含宏定义、内存管理和文件操作的完整示例程序:

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

// 宏定义
#define BUFFER_SIZE 256
#define SQUARE(x) ((x) * (x))

int main() {
    // 使用宏函数
    int result = SQUARE(5);
    printf("Square of 5: %d\n", result);

    // 动态内存分配
    char *buffer = (char *)malloc(BUFFER_SIZE * sizeof(char));
    if (buffer == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }
    strcpy(buffer, "This is a dynamically allocated string.");
    printf("%s\n", buffer);
    free(buffer);

    // 文件操作
    FILE *file = fopen("example.txt", "w");
    if (file != NULL) {
        fprintf(file, "Hello, file I/O!\n");
        fclose(file);
    }

    file = fopen("example.txt", "r");
    if (file != NULL) {
        char line[BUFFER_SIZE];
        while (fgets(line, BUFFER_SIZE, file) != NULL) {
            printf("%s", line);
        }
        fclose(file);
    }

    return 0;
}

相关推荐

  1. C语言12 定义

    2024-07-17 23:42:05       21 阅读
  2. C语言定义,,__FILE__,__LINE__,## 用法

    2024-07-17 23:42:05       39 阅读
  3. C语言】(8)定义

    2024-07-17 23:42:05       52 阅读
  4. C语言共享

    2024-07-17 23:42:05       29 阅读
  5. 常用的C语言定义

    2024-07-17 23:42:05       60 阅读
  6. C语言-定义2.0

    2024-07-17 23:42:05       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 23:42:05       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 23:42:05       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 23:42:05       57 阅读
  4. Python语言-面向对象

    2024-07-17 23:42:05       68 阅读

热门阅读

  1. 使用Python进行车牌识别

    2024-07-17 23:42:05       21 阅读
  2. Android11 设置一个默认密码 万能密码

    2024-07-17 23:42:05       18 阅读
  3. github.com/antchfx/jsonquery基本使用

    2024-07-17 23:42:05       19 阅读
  4. 初学Python必须知道的14个强大单行代码

    2024-07-17 23:42:05       20 阅读
  5. 讲真,现在留给2024年下半年软考的时间还够吗?

    2024-07-17 23:42:05       22 阅读
  6. 【MySQL】10.用户管理

    2024-07-17 23:42:05       21 阅读
  7. 前端学习(二)

    2024-07-17 23:42:05       17 阅读
  8. JVM 垃圾回收算法

    2024-07-17 23:42:05       21 阅读
  9. 脑电信号中的相位的类型和作用

    2024-07-17 23:42:05       24 阅读
  10. MySQL表中允许有多少个 TRIGGERS(触发器)?

    2024-07-17 23:42:05       19 阅读
  11. 生成式 AI 的发展方向,是 Chat 还是 Agent?

    2024-07-17 23:42:05       17 阅读
  12. 面试题 HashMap中key的存储索引是怎么计算的

    2024-07-17 23:42:05       21 阅读