鱼C论坛

 找回密码
 立即注册
查看: 2942|回复: 4

求助

[复制链接]
发表于 2023-1-2 10:31:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这段代码的目的是用malloc和realloc函数创建一个可以存放任意长度整数的容器
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define INCREMENT 10
  4. #define INIT_SIZE INCREMENT

  5. int main(void)
  6. {
  7.         char ch;
  8.         char *num; // 存储整个数据的首地址
  9.         char *last; // 最近一次迭代的起始地址
  10.         int limit = 0; // 每次迭代的限制值
  11.         long times = 1; // 记录重新申请多少次内存

  12.         num = (char *)malloc(INIT_SIZE);
  13.         if (num == NULL)
  14.         {
  15.                 exit(1);
  16.         }

  17.         last = num;

  18.         printf("请输入一个整数:");

  19.         while ((ch=getchar()) != '\n')
  20.         {
  21.                 last[limit++] = ch;
  22.                 if (limit >= INCREMENT)
  23.                 {
  24.                         int offset = last - num;
  25.                         num = (char *)realloc(num, INIT_SIZE + INCREMENT * times++);
  26.                         last = num;
  27.                         last += offset;
  28.                         last += INCREMENT;
  29.                         limit = 0;
  30.                 }
  31.         }
  32.         last[limit] = '\0';

  33.         printf("你输入的整数是:%s\n", num);

  34.         return 0;
  35. }
复制代码

我不太理解if (limit >= INCREMENT)代码块里面是在做什么
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-1-2 11:27:09 | 显示全部楼层
  1. //int offset = last - num;
  2.                         num = (char *)realloc(num, INIT_SIZE + INCREMENT * times++);
  3.                         //last = num;
  4.                         //last += offset;
  5.                         last += INCREMENT;
  6.                         limit = 0;
复制代码

我把if里面的语句注释掉了一部分也可以正常运行啊,不太理解为什么要这么写
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-4 14:46:53 | 显示全部楼层

回帖奖励 +5 鱼币

本帖最后由 两手空空儿 于 2023-1-4 14:51 编辑

这里竟然还有一份原码。。。。。。。。。两个帖子结合起来看就更清楚了
我帮你注释一下
  1. if (limit >= INCREMENT)     
  2. //limit== INCREMENT的时候,last[limit]的位置就已经到了字符串num的末尾之后的一个单元,已经越界了,要让num增加长度
  3. //limit 是不可能> INCREMETN 的
  4.                 {
  5.                         int offset = last - num;        //记录last到num的地址偏移量
  6.                         num = (char *)realloc(num, INIT_SIZE + INCREMENT * times++);      //为num增加一个INCREMENT的长度
  7.                         last = num;          //
  8.                         last += offset;      //这两句让last指向num串的第一个空位置
  9.                         last += INCREMENT;      //这句应该是有问题的,再加一个INCREMET就越界了,我认为应该删除,没有测试****************
  10.                         limit = 0;
  11.                 }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-4 14:50:44 | 显示全部楼层
pkqbszs 发表于 2023-1-2 11:27
我把if里面的语句注释掉了一部分也可以正常运行啊,不太理解为什么要这么写

那是你输入的不够长,在两个INCREMENT的长度内,把这几句注释掉是没问题的,再长肯定就有问题了,你可以试一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-6 15:59:03 | 显示全部楼层

回帖奖励 +5 鱼币

动态扩容。
当数据量大于设定阈值 (即INCREMENT)时,
会再额外申请一部分空间(在原空间后面追加空间)并重置阈值(将阈值再提高以防止无限扩容导致 内存溢出等bug)
last可以看作是记录第一个空地址的指针。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 22:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表