gpt4 book ai didi

c - realloc() 有任何限制吗

转载 作者:行者123 更新时间:2023-11-30 18:17:05 25 4
gpt4 key购买 nike

在这里,我尝试编写一段代码,通过操作字符串来查找 2 的幂。我知道这可以通过一些内置函数来完成,但我有兴趣使用字符串操作技术来完成此操作。

这个问题在 276 之前都可以正常工作,然后我不知道为什么我的程序会显示一些不需要的字符。我不明白为什么这种情况恰好从指数 76 开始发生,而在此之前我得到了所需的输出。

这是我的代码。希望我能在您的帮助下找到问题所在。

<小时/>

代码:

Note: Here I use 4 functions

  1. int len() : to find length of string.
  2. void add() : to perform the operation to find power of 2.
  3. void rev() : displays string in reverse order, as its the desired output.
  4. int main()
    #include <stdio.h>
#include <stdlib.h>

char *a;
int i;

int len()
{
for(i=0;a[i]!='\0';i++);
return i;
}

void rev()
{
printf("\n");
for(i=len();i>=0;i--)
printf("%c",a[i]);
printf("\n-------------------\n");
}

void add()
{
int k,v=0;
for(k=0;k<len();k++)
{
v=2*(((int)a[k])-48);
a[k]=v+48;
}
for(k=0;k<len();k++)
{
if((int)a[k]>57)
{
if(k<(len()-1))
{
a[k+1]+=1;
a[k]=((((int)a[k])-48)%10)+48;
}//in if 1
if(k==len()-1)
{
realloc(a,(len()+1)*sizeof(char));
a[k+1]=49;
a[k]=((((int)a[k])-48)%10)+48;
}//in if 2
}//out if
}//for
}//add

int main()
{
int j;
a=(char *)calloc(1,sizeof(char));
a[0]='1';
for(j=1;j<=81;j++)
{
add();
printf(" %d :\n",j);
rev();
}
scanf("%d",&i);
return 0;
}
<小时/>

我不明白出了什么问题...realloc 在分配内存方面有限制还是我的系统有问题?

<小时/>

编辑:

正如@DavidSchwartz建议的那样,我必须将新返回的指针起始地址分配给变量

a=realloc(a,(len()+1)*sizeof(char));

我想知道如何有效地检测和避免溢出。

最佳答案

您需要分配 '\0'到您的数组(在您分配的范围内)。

假设假设有一组鸡蛋存储在鸡蛋盒中。如果您告诉某人纸箱开头有一系列鸡蛋,一直持续到他们到达末端鸡蛋(看起来与其他鸡蛋不同的东西),当他们找不到末端鸡蛋时会发生什么?头脑爆炸就是发生的事情。他们可能会对你大喊大叫,指责你表现得很愚蠢;行为未定义。

从计算机的角度来看,我们应该继续寻找终端鸡蛋,穿过纸箱的另一端,到地板上,到门外,到路上,然后......我们'再次被车撞;该行为再次未定义。

您需要将终止蛋放入纸箱中。请记住,这意味着您还需要为终止鸡蛋腾出空间。

<小时/>

存储realloc的返回值放入临时变量!

事实上,realloc 确实有局限性,C的其余部分也是如此:这些限制主要影响那些猜测如何使用它而不是阅读的人( the manual ),正如您所观察到的。该手册有两点值得借鉴:

  • 有可能 realloc可能会分配一个对象,具有不同地址,并通过返回值进行通信。
  • 何时 realloc失败,会返回 NULL 。重要的是不要对数组溢出进行充电,并且要注意 old 指针还没有被 free d;如果您用新的(空)指针值覆盖旧的指针值,您将无法 free它...你会泄漏内存。

事实上,您(几乎)应该始终检查每个标准 C 函数的返回值。如果您不知道如何操作,请找到适当的手册并阅读。如果您无法阅读本手册而不对从上到下的所有内容感到困惑,那么您需要一本更好的书,因为您还没有掌握基础知识。

以下是您应该(几乎)始终使用 realloc 的方式:

void *temp = realloc(array, size);
if (temp == NULL) {
/* XXX: Handle allocation failure */
}
array = temp;

如何从分配失败中恢复是您的决定,但重要的是您可以从分配失败中恢复(并且不会同时泄漏内存)。填充上述代码中的空白(XXX 注释)的简单解决方案是:

void *temp = realloc(array, size);
if (temp == NULL) {
free(array); // This'll stop valgrind from complaining about leaked memory
exit(EXIT_FAILURE);
}
array = temp;
<小时/>

您不使用strlen有什么特殊原因吗? ?也许你的书还没有教你这一点。

<小时/>
((((int)a[k])-48)%10)+48;

这是什么?你的书还没有教你可以对字符常量进行加法和减法吗?这更加便携和清晰:(a[k] - '0') % 10 + '0'

说到书籍,显然你的书不适合你。我相信您将从 K&R“C 编程语言,第二版”中受益。当你遇到它们时做练习;不要跳过它们。

<小时/>

还有一件事:Don't cast malloc , realloc or calloc

关于c - realloc() 有任何限制吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36267684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com