|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#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后面是存任意尺寸字符的关键代码但是看不太懂原理能帮忙讲讲吗
还有那个void *realloc(void *ptr, size_t size);括号里面的东西要根据什么来写?
本帖最后由 xieglt 于 2020-10-16 09:08 编辑
- while ((ch=getchar()) != '\n')
- {
- //将读取的字符保存进内存
- last[limit++] = ch;
- //当读取的字符数达到预分配的内存数(INCREMENT)时,对内存进行重新分配
- if (limit >= INCREMENT)
- {
- int offset = last - num;
- //重新分配内存,每次重新分配的大小 = 上次分配的大小 + INCREMENT
- //即每次多分配 INCREMENT 的字节数
- num = (char *)realloc(num, INIT_SIZE + INCREMENT * times++);
- //realloc 函数会保存内存重新分配之前的内容
- //这里为了不覆盖之前的输入字符,需要计算新分配内存的起始地址
- //简单点来说,可以写成 last = num + INIT_SIZE + INCREMENT * (times - 1)
- last = num;
- last += offset;
- last += INCREMENT;
- limit = 0;
- }
- }
复制代码
realloc(void * ptr,size_t size)
void * ptr : 需要重新分配的内存指针
size_t size : 重新分配内存的大小(字节数)
|
|