- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在这里,我尝试编写一段代码,通过操作字符串来查找 2 的幂。我知道这可以通过一些内置函数来完成,但我有兴趣使用字符串操作技术来完成此操作。
这个问题在 276 之前都可以正常工作,然后我不知道为什么我的程序会显示一些不需要的字符。我不明白为什么这种情况恰好从指数 76 开始发生,而在此之前我得到了所需的输出。
这是我的代码。希望我能在您的帮助下找到问题所在。
<小时/>代码:
Note: Here I use 4 functions
int len()
: to find length of string.void add()
: to perform the operation to find power of 2.void rev()
: displays string in reverse order, as its the desired output.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 编程语言,第二版”中受益。当你遇到它们时做练习;不要跳过它们。
<小时/>关于c - realloc() 有任何限制吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36267684/
如果 realloc 失败并返回 NULL 是前一个缓冲区被释放还是保持不变?我没有在手册页中找到那条特定的信息,我不确定该怎么做。如果内存被释放,那么双重释放可能会有风险。如果没有,就会发生泄漏。
OS: Linux CC: GCC 4.8.2 目标:改变 char* 的大小 -> 变小 问题:更改后的大小相同... 行是带有数据的字符串... 代码片段: char * tmp = NUL
在一个函数中我使用了 malloc : void name1(struct stos* s) { s = malloc (4 * sizeof (int)); } 一切正常。但是后来我用了rea
我知道有一个 realloc允许我调整内存块大小的函数(它与一个免费函数配对)。但是,我正在尝试对一些成员指针使用 new 而不是 realloc 分配内存的 c++ 类执行相同的操作。在 C++ 中
我正在尝试在 C 中创建一个动态整数数组,它应该在填满后自动将其大小加倍。 要扩展数组的大小,我想使用 realloc 函数。不幸的是,指向我的 DynamicArray 和 GCC 崩溃的数据的指针
这是我被教导使用的方式 realloc() : int *a = malloc(10); a = realloc(a, 100); // Why do we do "a = .... ?" if(a
我尝试在每个循环中使用 realloc(),因此我只为 C 中的 int 数组使用必要的内存,但输出值已更改。尽管如此,在我的代码中使用 Valgrind 时,我得到了正确的值。 我在做 Advent
平台:Linux 3.2.0 x86 (Debian Wheezy) 编译器:GCC 4.7.2 (Debian 4.7.2-5) 我想知道如果我尝试 realloc() 一个已递增的指针会发生什么。
我知道可以在内核中使用 malloc 在 GPU 的全局内存上分配内存。是否也可以使用realloc? 最佳答案 您可以为您的数据类型编写自己的 realloc 设备函数。 只需为新数组分配新空间,将
我在对数组使用 malloc/realloc 命令时遇到了一些问题。我创建了一个包含一些整数的小数组,并尝试通过使用 realloc 扩展大小并添加值来为其添加一个值,但是当我这样做时,0 索引的值不
背景: 我使用 calloc() 创建了一个数组,一切都运行良好。然后我使用 realloc() 使数组更大。它似乎只是创建一个没有任何内容的新指针,并在我尝试访问数组中的元素时调用运行时错误。 我的
假设我已经使用 malloc() 分配了内存,如果我在我的代码中这样做: char *newline = realloc ( oldline , newsize ); // Assuming oldl
我正在尝试在下面的程序中使用 realloc 重新分配内存,并在我使用 malloc(i = (int*)malloc(5 * sizeof(int))) 使用react的 realloc 初始内存之
为什么下面的代码输出两次 4,而不是 8 和 20?谢谢 int size = 0; int *pointer; pointer = malloc(2 * sizeof(int)); size = s
我正在尝试将一堆 WCHAR 添加到缓冲区。这个函数就是将它添加到我的缓冲区中的原因.. DWORD add_to_buffer(BYTE *databuffer, WCHAR *path, WCHA
可能我的大脑现在不能正常工作......我想知道为什么我在我的代码中收到提到的错误: int ** zm; zm = (int**)calloc(1, sizeof(int*)); *zm = (in
我正在尝试用 C 语言编写代码,但遇到了 realloc 的问题。该代码在某个时间点工作正常,但在另一时间重新分配期间因堆损坏错误而崩溃。我已将填充数据的结构和函数粘贴到其中。谁能告诉我我是否在这里做
realloc 会改变它的第一个参数吗? 改变第一个参数是否取决于实现? 有什么理由不应该是const吗?作为反例,memcpy 将其 src 参数设为 const。 ISO C 标准,第 7.20.
我在 realloc 中遇到此错误,该错误仅发生在我学校的实验室计算机上,而不发生在我的计算机上。 在此程序中,我将行号存储在 File_Node 结构中。 File_Node 是一个链表的一部分,每
来自 man realloc:realloc() 函数返回一个指向新分配的内存的指针,该指针适合任何类型的变量,可能与 ptr 不同,如果请求失败,则返回 NULL . 因此在此代码片段中: ptr
我是一名优秀的程序员,十分优秀!