realloc函数的功能和用法
一、函数功能
realloc函数是C语言标准库中的一个函数,用于重新分配已分配内存块的大小。它既可以用来扩大已分配的内存块,也可以用来缩小内存块的大小。如果新分配的内存块大小与原始大小不同,realloc会尝试在原地扩展内存(如果可能),或者如果原地扩展不可行,则会在新的位置分配内存,并将原始数据复制到新位置。如果新分配的内存块比原始内存块小,realloc会简单地截断超出新大小的数据。
二、函数用法
//原型
void* realloc(void* ptr, size_t size);
- 参数:
ptr
:指向已分配内存的指针。如果ptr
是NULL,则realloc的行为与malloc相同,即分配一块新的内存。size
:新的内存块大小,以字节为单位。
- 返回值:
- 如果内存分配成功,realloc返回指向新内存块的指针。这个指针可能与
ptr
相同(如果内存在原地扩展成功),也可能不同(如果在新位置分配了内存)。 - 如果内存分配失败,realloc返回NULL。此时,原始的内存块
ptr
仍然有效,且其内容保持不变,需要用户手动释放。
- 如果内存分配成功,realloc返回指向新内存块的指针。这个指针可能与
- 实现fgetc和fgets,实现fputc和fputs
-
#include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE 1024 int my_fgetc(FILE *fp) { char c; if (fread(&c, sizeof(char), 1, fp) == 1) { printf("my_fgetc = %c\n", c); return (int)c; // 返回读取的字符 } return EOF; // 表示读取失败或到达文件末尾 } void my_fgets(FILE *fp) { char buf[SIZE]; if (fgets(buf, SIZE, fp) != NULL) { printf("my_fgets = %s", buf); } else { printf("读取失败或到达文件末尾\n"); } } int my_fputc(char c, FILE *fp) // 修改参数类型为 char { if (fwrite(&c, 1, 1, fp) == 1) { return 1; } return -1; // 表示写入失败 } int my_fputs(const char *s, FILE *fp) { size_t bytesWritten = fwrite(s, sizeof(char), strlen(s), fp); return bytesWritten == strlen(s) ? 0 : EOF; // 0表示成功,EOF表示失败 } int main(int argc, char **argv) { if (argc < 2) { fprintf(stderr, "Usage: %s <filename>\n", argv[0]); return 1; } FILE *fp1 = fopen(argv[1], "r"); if (NULL == fp1) { perror("文件打开失败"); return 1; } // 调用函数 my_fgetc(fp1); fseek(fp1, 0, SEEK_SET); // 重置文件指针到文件开头 my_fgets(fp1); // 关闭文件指针 fclose(fp1); return 0; }