Realloc 在循环内第 10 次迭代后失败

2024-04-18

我试图从用户那里获取一系列字母,并将输入放入动态数组中。

然而,由于我不太明白的原因 - 如果用户输入超过 10 个字母,则 realloc 失败(返回 NULL 并打印“分配内存时出错!”)。我确实尝试将 realloc 更改为 calloc ,这似乎解决了问题,但我不确定为什么。

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char **argv) {

    char *first_string, *second_string, *memory_check;
    char user_input;
    int first_string_size = 0, second_string_size = 0, debug =1;

    first_string = malloc(sizeof(char));
    second_string = malloc(sizeof(char));


    // gets the strings from the user

    printf("Input the first string:");

    for(int i = 0;;i++) {
        user_input= getchar();
        if(user_input == EOF || user_input == '\0' || user_input == '\n') {
            break;
        }
        first_string[i] = user_input;
        memory_check = realloc(first_string, (i+1)*(sizeof(char)));
        if(memory_check == NULL) {
            printf("\nError allocating memory!\n");
            break;
        }

        first_string_size = i;

        if(debug == 1) {
            printf("\n number of letters is %d", first_string_size +1);
            printf("\n array size in memory is %d", sizeof(first_string) * (i+1));
        }
    }

    return 0;
}

当然失败了:

memory_check = realloc(first_string, (i+1)*(sizeof(char)));
    if(memory_check == NULL) {
        printf("\nError allocating memory!\n");
        break;
    }

你正在使用memory_check作为检查是否可以重新分配的标志,但不仅如此。

You have将其分配回first_string.

在你的情况下,这是一个致命的赠品:前 10 次(当然,在你的情况下,这没有指定或定义,它是纯随机的),内存区域不需要移动,这说明它可以工作。但过了一段时间后,realloc无法重用同一块(因为它太小)并且它会更改内存位置。

由于您没有更新它,因此您会得到未定义的行为。

你可以这样做:

memory_check = realloc(first_string, (i+1)*(sizeof(char)));
if(memory_check == NULL) {
    printf("\nError allocating memory!\n");
    free(first_string);
    break;
}
first_string = memory_check;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Realloc 在循环内第 10 次迭代后失败 的相关文章

随机推荐

  • 在 JavaScript 中获取不同的集合

    For 代码出现第 12 天 http adventofcode com 2017 leaderboard day 12我有一个解决方案 最终得到这种类型的结构 let structure new Set new Set 1 42 new
  • Turbine 仪表板未加载 Spring Cloud 微服务中的聚合

    我正在尝试使用 Spring MVC 和 Spring Boot 框架开发 Spring Cloud 微服务 以及用于 Spring Cloud 的 Eureka 服务器 Zuul Ribbon hystrix 和 Turbine 我已经开
  • MPI 矩阵向量乘法返回有时正确有时奇怪的值

    我有以下代码 Start MPI MPI Init argc argv int size atoi argv 1 int delta 10 int rnk int p int root 0 MPI Status mystatus MPI C
  • 如何与 Firebase 一起安装更新版本的nanopb

    我正在尝试将 Firebase 版本更新到 8 4 0 并遇到以下错误 为了更新 我在 pod 文件中将 Firebase Core Firebase Crashlytics Firebase Performance 的版本指定为 8 4
  • 无法推送到 Google 容器注册表(访问被拒绝)

    当我尝试推送容器镜像 https cloud google com container registry docs pushing and pulling到容器注册表 它给了我以下错误 被拒绝 项目 my proj 123 的令牌交换失败
  • AFNetworking 2.0取消特定任务

    我正在尝试 afnetworking 2 0 只是想弄清楚如何取消特定任务 旧的方法是使用类似的东西 self cancelAllHTTPOperationsWithMethod POST path user receipts 但我在 2
  • 有没有一种方法可以在不使用 PHP 或 JavaScript 的情况下拉伸文本区域以适应其内容?

    我正在用内容填充文本区域供用户编辑 是否可以使用 CSS 使其拉伸以适应内容 例如overflow show对于一个div 仅一行
  • Ajax 深度链接? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Laravel 未定义

    好吧 我正在使用新的 laravel 5 3 和 vue js 我想对数据库中的一些用户进行 GET 调用 顺便说一句 我正在使用组件 这是我的 app js require bootstrap Vue component example
  • 将 Apache Camel CMIS 与 Sharepoint 2013 结合使用

    我可以从 Chrome REST 客户端成功访问 Sharepoint 2013 AtomPub 界面 以下 URL 为我提供了我想要的文件 http ourintranet 100 personal myname vti bin cmis
  • UITableViewCell 中的 UIScrollView 不滚动

    我正在向具有滚动视图的 UITableView 添加一个单元格 单元格中的代码是 UIScrollView scrollView UIScrollView alloc initWithFrame CGRectMake 0 30 320 44
  • 使用 jQuery 显示 div。 CSS问题

    我有三个 divdisplay inline block 在每个 div 中我都有 divdisplay none当我试图显示隐藏的 div 时 div id show 1000 最近的 div 跳跃 我应该改变什么 我确实喜欢看到 div
  • Java EE 5 API 的单个/完整 Maven 依赖项

    是否有包含整个 Java EE 5 规范 API 的单个 Maven 依赖项 就像
  • Git Push 澄清 - 推送什么?

    When I push http www kernel org pub software scm git docs git push html本地工作目录到中央存储库 执行all中间分支和提交信息 从上次推送到这次 是否被推送 换句话说 是
  • 使用无符号整数溢出是一个好的做法吗?

    前几天我正在阅读 C 标准 并注意到与有符号整数溢出 未定义 不同 无符号整数溢出有明确的定义 我已经看到它在很多代码中用于最大值等 但是考虑到有关溢出的巫毒 这被认为是良好的编程实践吗 无论如何都是不安全的吗 我知道许多现代语言 例如 P
  • 同时打印到屏幕并写入文件

    我在网上找到了一些通常有效的代码 但我想在同一个程序中多次使用它 将不同的内容写入不同的文件 同时仍然始终打印到屏幕上 也就是说 当它关闭时 我认为 sys stdout 关闭 因此根本无法打印 并且再次使用此类会失败 我尝试重新导入 sy
  • 在 MATLAB 中数值计算复值函数的导数

    我想在 MATLAB 中以数值方式计算复值函数 全纯函数 的导数 我已经计算了复平面上网格中的函数 并且尝试使用柯西 黎曼关系来计算导数 鉴于 u 实数 f v imag f x 实数 点 y imag 点 导数应由下式给出 f du dx
  • 如何在 Pygame 中翻转图像

    我希望图像在向右移动时朝右 在向左移动时朝左 我不知道在这里要做什么 这是一项作业 不需要翻转图像 但我仍然想学习如何做到这一点 Author victor Xu Date January 21st 2021 Description Ani
  • 我可以获取指纹值吗?

    我尝试获取指纹值并存储它 之后 我尝试比较一下 value 与来自另一个硬件的指纹值 指纹 sensor Q1 他们之间可以比较吗 Q2 如果可以的话 我怎样才能获得这个值 我搜索过这些问题 发现这是不可能的 但我觉得 获取指纹信息的方法是
  • Realloc 在循环内第 10 次迭代后失败

    我试图从用户那里获取一系列字母 并将输入放入动态数组中 然而 由于我不太明白的原因 如果用户输入超过 10 个字母 则 realloc 失败 返回 NULL 并打印 分配内存时出错 我确实尝试将 realloc 更改为 calloc 这似乎