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;
}

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chem4111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值