求助
这段代码的目的是用malloc和realloc函数创建一个可以存放任意长度整数的容器#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 = 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 = '\0';
printf("你输入的整数是:%s\n", num);
return 0;
}
我不太理解if (limit >= INCREMENT)代码块里面是在做什么 //int offset = last - num;
num = (char *)realloc(num, INIT_SIZE + INCREMENT * times++);
//last = num;
//last += offset;
last += INCREMENT;
limit = 0;
我把if里面的语句注释掉了一部分也可以正常运行啊,不太理解为什么要这么写 本帖最后由 两手空空儿 于 2023-1-4 14:51 编辑
这里竟然还有一份原码。。。。。。。。。两个帖子结合起来看就更清楚了
我帮你注释一下
if (limit >= INCREMENT)
//limit== INCREMENT的时候,last的位置就已经到了字符串num的末尾之后的一个单元,已经越界了,要让num增加长度
//limit 是不可能> INCREMETN 的
{
int offset = last - num; //记录last到num的地址偏移量
num = (char *)realloc(num, INIT_SIZE + INCREMENT * times++); //为num增加一个INCREMENT的长度
last = num; //
last += offset; //这两句让last指向num串的第一个空位置
last += INCREMENT; //这句应该是有问题的,再加一个INCREMET就越界了,我认为应该删除,没有测试****************
limit = 0;
} pkqbszs 发表于 2023-1-2 11:27
我把if里面的语句注释掉了一部分也可以正常运行啊,不太理解为什么要这么写
那是你输入的不够长,在两个INCREMENT的长度内,把这几句注释掉是没问题的,再长肯定就有问题了,你可以试一下 动态扩容。
当数据量大于设定阈值 (即INCREMENT)时,
会再额外申请一部分空间(在原空间后面追加空间)并重置阈值(将阈值再提高以防止无限扩容导致 内存溢出等bug)
last可以看作是记录第一个空地址的指针。
页:
[1]