realloc() 旧大小无效

2024-01-31

我正在做 K&R C 编程书中的一个练习。该程序用于从用户输入的一组行中找到最长的行,然后打印它。

这是我写的(部分内容直接摘自书中):-

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

int MAXLINE =  10;
int INCREMENT = 10;

void copy(char longest[], char line[]){
    int i=0;

    while((longest[i] = line[i]) != '\0'){
        ++i;
    }
}

int _getline(char s[]){
    int i,c;

    for(i=0; ((c=getchar())!=EOF && c!='\n'); i++){
        if(i == MAXLINE - 1){
            s = (char*)realloc(s,MAXLINE + INCREMENT);

            if(s == NULL){
                printf("%s","Unable to allocate memory");
                //  goto ADDNULL;
                exit(1);
            }

            MAXLINE = MAXLINE + INCREMENT;
        }
        s[i] = c;
    }

    if(c == '\n'){
        s[i] = c;
        ++i;
    }

ADDNULL:
    s[i]= '\0';
    return i;
} 

int main(){
    int max=0, len;

    char line[MAXLINE], longest[MAXLINE];

    while((len = _getline(line)) > 0){
        printf("%d", MAXLINE);
        if(len > max){
            max = len;
            copy(longest, line);
        }
    }

    if(max>0){
        printf("%s",longest);
    }

    return 0;
}

当我一行输入超过10个字符时,程序崩溃并显示:-

*** Error in `./a.out': realloc(): invalid old size: 0x00007fff26502ed0 ***
======= Backtrace: =========
/lib64/libc.so.6[0x3d6a07bbe7]
/lib64/libc.so.6[0x3d6a07f177]
/lib64/libc.so.6(realloc+0xd2)[0x3d6a0805a2]
./a.out[0x400697]
./a.out[0x40083c]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x3d6a021b45]
./a.out[0x400549]

我也检查过重新分配无效的旧大小 https://stackoverflow.com/questions/11406311/realloc-invalid-old-size但无法遵循将指针传递给修改数组的函数的指针的逻辑。


realloc调用将通过获取指向存储区域的指针来重新分配内存heap即调用的动态分配的内存结果malloc.

在你的情况下,问题是你正在分配内存stack而不是通过调用动态地malloc这导致内存分配heap。并且,传递的指针automatic字符数组line to _getline它用它来调用realloc。所以,你得到了错误。

尝试动态分配字符数组line :

char* line  = (char *) malloc(MAXLINE); 
char* longest = ( char *) malloc(MAXLINE);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

realloc() 旧大小无效 的相关文章

随机推荐

  • Ajax:如何知道用户脚本实现是否未设置 Origin 标头?

    某些用户脚本实现 例如 Google Chrome 允许直接跨 AJAX 请求 但其他一些则不允许 并且使用同源策略限制 这是代码的一部分 Get the size of the file Button the current button
  • 如何写入 aws lambda 实例的文件系统?

    我尝试写入 aws lambda 实例的文件系统失败 文档说 http docs aws amazon com lambda latest dg limits html标准 lambda 实例有 512mb 的可用空间 tmp 但是 在我的
  • 通过页面重新加载进行重定向 Vue JS Router

    我有一个带有 Login vue 和 Home vue 文件的应用程序 因为我将管理 HTML 网站转换为 vue 3 应用程序 所以我的 javascript 仅适用于页面重新加载 创建应用程序时 我选择为 SPA 添加路由器 也许我不应
  • F# 中的显式类型递归

    灵感来自这个问题 https stackoverflow com questions 1228644 are infinite types aka recursive types not possible in f F 中可以显式类型递归吗
  • 选中/取消选中所有复选框 - AngularJS ng-repeat

    我有一个如下所示的结构 http jsfiddle net deeptechtons TKVH6 http jsfiddle net deeptechtons TKVH6 div ul li Check All li ul div
  • PHP 在选择复选框时读取行的所有内容

    I have a PHP form as attached The form entries are pulled from mysql server On selection of a particular checkbox I need
  • 将 Numpy 数组保存为图像

    我有一个 Numpy 数组类型的矩阵 我如何将它作为图像写入磁盘 任何格式都可以 png jpeg bmp 一个重要的限制是 PIL 不存在 Using PIL https pillow readthedocs io en stable 保
  • 适用于多个目的地和单个来源的 iOS MKDirections

    我的应用程序需要从一组 10 个步行点中获取距离用户 最近 的步行点 我已经看到 MKDirections 使用 calculateDirectionsWithCompletionHandler 针对单个源 目标位置执行此操作 我的问题是
  • 每 x 秒调用一次函数(Python)[重复]

    这个问题在这里已经有答案了 我想每 10 秒调用一个函数 实际上 它是一个 Web API 但该函数可能需要随机 t 秒才能返回 假设 t 为 0 1 至 1 0 秒 我们能想到的最简单的代码是 while True func take t
  • Docker BuildKit --mount=type=cache 不起作用,为什么?

    我正在尝试实施Buildkit 的缓存挂载功能 https github com moby buildkit blob master frontend dockerfile docs experimental md run mounttyp
  • 多个源代码存储库

    我使用 Mercurial 对源代码进行版本控制 但有些人更喜欢其他版本控制系统 如 git Bazaar SVN CVS 我想知道 是否可以同时将一个存储库存储在多个系统下 以便人们可以使用他们想要的任何存储库 GitHub 开发了hg
  • Nginx 无法加载 CSS 和 JS 文件(MIME 类型错误)?

    我的网站上出现以下错误 Error There are multiple templates named velvet Each template needs a unique name 1b1a247fc034d5089f331ec954
  • 如何在 Angularjs 中使用 $event 更新事件点击时的 ng-model

    http plnkr co ywhmyO http plnkr co ywhmyO 我尝试过编译和指令 但一无所获 示例中的编译代码是直接从 Angular 网站上撕下来的 但我不知道如何使用它 非常感谢任何指导 你被这样的事实绊倒了ng
  • 如何在类图中显示单例关系

    如果一个类包含指向单例类的指针 它可以是aggregation 据我了解 这不可能是has a关系 因为该类不会创建单例类的实例 它只是像这样使用它association关系 标题并不像所写的那样100 完全有意义 有单例类 但没有真正的单
  • 以编程方式设置 GoogleMapOptions

    我像这样膨胀我的片段 GoogleMap map MapFragment getFragmentManager findFragmentById R id MapFragment map Fragment getMap 在这里我有我的选择
  • Lambda 日志和 CloudWatch PutLogEvents 限制

    I know Lambda 调用PutLogEvents在内部记录消息 CloudWatch 有限制PutLogEvents PutLogEvents 每个日志流每秒 5 个请求 我想知道 Lambda 日志流也可以被限制吗PutLogEv
  • Javascript 将 unicode 字符串转换为“标题大小写”

    我有一个 javascript 大小写转换问题 由于非英文字母 我无法解决该问题 我主要关心的是土耳其字母 我需要做的是这样的 你好世界 gt 你好世界 你好世界 gt 你好世界 你好世界 gt 你好世界 这是我到目前为止所取得的成就 St
  • Rails + Rspec + 机架 + 会话测试

    Gemfile 文件 机架 gt 1 6 0 我在将会话变量从 rspec 测试传递到 Rack 中间件时遇到了一些问题 我在互联网上浏览了很多文章 但没有任何解决方案可以帮助我理解 所以基本上我希望能够在我的中间件类中做到这一点 req
  • Grizzly / Glassfish - 无法建立 websockets 握手

    我正在尝试让 WebSockets 在 Grizzly Glassfish 之上工作 我已经克隆了示例 WebSockets 聊天应用程序 http java net projects grizzly sources git show sa
  • realloc() 旧大小无效

    我正在做 K R C 编程书中的一个练习 该程序用于从用户输入的一组行中找到最长的行 然后打印它 这是我写的 部分内容直接摘自书中 include