|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
// malloc 和 realloc 函数创建一个可以存放任意长度整数的容器(数字以字符的形式存储),想问一下第二个if语句啥意思,以及为啥用了malloc和realloc不用free释放(是没必要吗),如果能用怎样改进程序?
- #include <stdio.h>
- #include <stdlib.h>
- #define INCREMENT 10
- #define INIT_SIZE INCREMENT
- int main(void)
- {
- char ch;
- char *num; // 存储整个数据的首地址
- char *last; // 最近一次迭代的起始地址
- int limit = 0; // 每次迭代的限制值
- long times = 1; // 记录重新申请多少次内存
- num = (char *)malloc(INIT_SIZE);
- if (num == NULL)
- {
- exit(1);
- }
- last = num;
- printf("请输入一个整数:");
- while ((ch=getchar()) != '\n')
- {
- last[limit++] = ch;
- if (limit >= INCREMENT)
- {
- int offset = last - num;
- num = (char *)realloc(num, INIT_SIZE + INCREMENT * times++);
- last = num;
- last += offset;
- last += INCREMENT;
- limit = 0;
- }
- }
- last[limit] = '\0';
- printf("你输入的整数是:%s\n", num);
- return 0;
- }
复制代码
这段代码读取用户输入的一个整数,整数的长度没有限制,它可以足够长。整数的每个字符都存储在动态分配的内存中。
第二个 if 语句检查是否已经填满了当前分配的内存。如果已经填满了,就通过 realloc 函数扩大内存容量。在扩大之后,这个内存的地址可能会改变,所以需要更新 num 和 last 的值。代码还保持了一个偏移量 offset,当内存移动后,以保证 last 指向正确的位置。
至于为什么代码中没有使用 free 函数来释放内存,这是因为在程序结束时,操作系统会自动回收所有的进程内存。在这个程序中,动态分配的内存会在程序结束后被操作系统自动回收,所以不需要显式地调用 free。然而,如果你的程序是一个长期运行的程序,或者在运行期间动态分配了大量的内存,你应该在不再需要内存的时候释放它,以避免内存泄漏。
可以改进这个程序,在程序结束之前,通过调用 free 函数来释放动态分配的内存。这个改进版本的程序如下:
- #include <stdio.h>
- #include <stdlib.h>
- #define INCREMENT 10
- #define INIT_SIZE INCREMENT
- int main(void)
- {
- char ch;
- char *num; // 存储整个数据的首地址
- char *last; // 最近一次迭代的起始地址
- int limit = 0; // 每次迭代的限制值
- long times = 1; // 记录重新申请多少次内存
- num = (char *)malloc(INIT_SIZE);
- if (num == NULL)
- {
- exit(1);
- }
- last = num;
- printf("请输入一个整数:");
- while ((ch=getchar()) != '\n')
- {
- last[limit++] = ch;
- if (limit >= INCREMENT)
- {
- int offset = last - num;
- num = (char *)realloc(num, INIT_SIZE + INCREMENT * times++);
- if (num == NULL)
- {
- exit(1);
- }
- last = num + offset;
- limit = 0;
- }
- }
- last[limit] = '\0';
- printf("你输入的整数是:%s\n", num);
- // 释放动态分配的内存
- free(num);
- return 0;
- }
复制代码
这个改进版本的程序在程序结束之前,释放了动态分配的内存。在代码中,如果 realloc 函数返回 NULL,表明内存分配失败,程序会立即退出。如果内存分配成功,程序会继续执行,并在结束时释放动态分配的内存。
|
|