valgrind - 地址 ---- 是分配大小为 8 的块后的 0 字节

2024-02-01

首先,我知道similar已提出问题。但是,我想问一个关于真正原始 C 数据类型的更一般的简单问题。所以就是这样。

In main.c我调用一个函数来填充这些字符串:

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

    char *host = NULL ;
    char *database ;
    char *collection_name;
    char *filename = ""; 
    char *fields = NULL;
    char *query = NULL;
    ...

    get_options(argc, argv, &host, &database, &collection_name, &filename, 
                &fields, &query, &aggregation);

Inside get_options:

if (*filename == NULL ) {
   *filename = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+4);
    strcpy(*filename, *collection_name);
    strcat(*filename, ".tde");  # line 69 
}

我的程序运行良好,但是 Valgrind 告诉我我做错了:

==8608== Memcheck, a memory error detector
==8608== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==8608== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==8608== Command: ./coll2tde -h localhost -d test -c test
==8608== 
==8608== Invalid write of size 1
==8608==    at 0x403BE2: get_options (coll2tde.c:69)
==8608==    by 0x402213: main (coll2tde.c:92)
==8608==  Address 0xa2edd18 is 0 bytes after a block of size 8 alloc'd
==8608==    at 0x4C28BED: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8608==    by 0x4C28D6F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8608==    by 0x403BBC: get_options (coll2tde.c:67)
==8608==    by 0x402213: main (coll2tde.c:92)

你能解释一下这个错误吗Address 0xa2edd18 is 0 bytes after a block of size 8 alloc'd? 我该如何解决这个问题?


strcpy添加空终止符'\0'。您忘记为其分配空间:

*filename = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+5);

您需要添加 5 个字符的空格:4 个字符".tde"后缀,再加一个后缀'\0'终结者。您当前的代码仅分配 4 个字节,因此最后一次写入是在您为新文件名分配的块之后的空间中完成的(即其后的 0 个字节)。

Note:您的代码有一个常见问题 - 它分配的结果realloc直接指向正在重新分配的指针。这很好,当realloc成功,但失败时会产生内存泄漏。修复此错误需要存储以下结果realloc在一个单独的变量中,并检查它NULL在将值分配回之前*filename:

char *tmp = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+5);
if (tmp != NULL) {
    *filename = tmp;
} else {
    // Do something about the failed allocation
}

直接赋值给*filename造成内存泄漏,因为指针*filename下面已经指出的将在失败时被覆盖,变得不可恢复。

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

valgrind - 地址 ---- 是分配大小为 8 的块后的 0 字节 的相关文章

随机推荐

  • 验证错误后jsf viewparam丢失[重复]

    这个问题在这里已经有答案了 我面临以下问题 在一页中 我列出了应用程序的所有用户 并为每个用户提供了一个 编辑 按钮 这是一个 GET 链接 id
  • 优化文件缓存和 HTTP2

    我们的网站正在考虑切换到 http2 我的理解是http2 使文件连接等优化技术变得过时 因为使用 http2 的服务器只发送一个请求 相反 我看到的建议是最好保持文件大小较小以便它们更有可能被浏览器缓存 这可能取决于网站的大小 但是如果网
  • 自动映射器配置文件未在启动时加载?

    我在用着 自动映射器 6 1 1 AutoMapper Extensions Microsoft DependencyInjection 3 0 1 看来我的个人资料没有被加载 每次我调用 mapper map 时我都会得到AutoMapp
  • 如何在 PHP cURL 请求中将 OData 发送到 RESTful API

    我正在尝试使用 PHP 将 GET 请求中的 OData 参数发送到 RESTful API 对此服务的格式正确的 OData 请求如下所示 https myapi org endpoint filter family name eq Do
  • 了解左值/右值表达式与对象类型

    我读过一些之前的最佳答案以及 Stroustrup 的 C 编程语言 和 Effective Modern C 但我很难真正理解表达式的左值 右值方面与其类型之间的区别 在 Effective Modern C 的简介中说 确定表达式是否为
  • 在这个简单的 WPF 应用程序中实现进度条

    我有 MainWindow 它有它的视图模型 MainWindowViewModel 窗口内有一个接受用户输入的文本框 几个用于过滤搜索的单选按钮和一个按钮 使用如下命令将按钮操作绑定到视图模型
  • 如何在列表视图上创建覆盖布局

    我有一个将填充的列表视图AsyncTask在应用程序的底部边缘 我需要显示固定的覆盖布局 如下所示 但我不知道如何在 xml 中做到这一点 这是我现在的layout xml
  • Haskell 中 zipWith fibonacci 的时间复杂度

    在 Haskell 中 斐波那契函数的规范 zipWith 实现是 fibs Integer fibs 1 1 zipWith fibs tail fibs 我很难分析这个的时间复杂度 谎言 n 尝试将其写在纸上 起初我认为它是指数级的 然
  • 在 Spyder IDE 中使用 Matplotlib 绘制内联或单独窗口

    当我使用 Matplotlib 绘制一些图形时 默认的内联绘图通常就可以了 但是 当我绘制一些 3D 图形时 我希望将它们放在单独的窗口中 以便可以启用旋转等交互 我可以在 Python 代码中配置哪个图形要内联显示以及哪个图形要在新窗口中
  • 在正则表达式中使用否定条件

    是否可以在 gsub 表达式中使用负匹配 我想替换以以下开头的字符串hello except那些开始于hello Peter my string gsub hello i 我应该放什么来代替 听起来你想要一个负面的前瞻 gt gt hell
  • Grails - 无法读取 org.grails.plugins:tomcat:zip:8.0.33 的工件描述符

    从今天早上开始 我似乎遇到了 grails 插件存储库的问题 使用 Grails 2 4 4 获取 证书中的主机名不匹配 jfrog io gt 或 jfrog io gt 或 BuildConfig 具有 在插件下构建 org grail
  • Spring Data Rest - 如何在 @RepositoryEventHandler 中接收标头

    我正在使用最新的 Spring Data Rest 并且正在处理该事件 创建之前 我的要求是还捕获提交给POST模型的端点 Client 但是 该界面存储库事件处理程序并没有暴露这一点 Component RepositoryEventHa
  • 将 CardView 置于仅包含一个元素的 RecyclerView 中

    我使用的 RecyclerView 包含带有 TextView 和 ImageView 的 CardView 每张卡代表一个城市 我还在每张卡片上都有一个 onClickListener 它可以引导我找到该城市的博物馆列表 Recycler
  • 如何使用 JSTL 循环遍历字符串中的每个字符?

    如何使用 JSTL 循环遍历字符串中的每个字符 棘手的使用fn substring 会做
  • Angular-Dart DI 库中的工厂注入

    在我的 Dart 应用程序中 我使用 MVP 模式和 Angular dart 依赖注入库 Angular di 在上面的示例中 我无法注入 MyView 或 MyPresenter 因为这是循环依赖项 class MyView MyPre
  • 术语:前向声明与函数原型

    对我来说 使用 C 编程语言时这些术语本质上是同义词 在实践中 我可能更喜欢文件内原型的 前向声明 而不是通过头文件包含的原型的 函数原型 但当你考虑预处理后会发生什么时 即使这也是人为的区别 也许我错过了一些东西 对于何时使用一个术语与另
  • 解构 Open Layers 3 地图

    所以 我使用 Open Layers 3 和 Ember js 来制作仪表板 并且我已经动态加载地图 但我希望它在我离开路线时被销毁 我发现的唯一东西是 map destroy 但它是针对旧版本的API 新版本中似乎没有 进入地图页面几次后
  • 取消设置 git 配置

    我在 Mac 上使用 FileMerge 来查看差异 并设置为 git config global diff external bin git diff cmd sh 现在我不想再使用 FileMerge 如何恢复到之前的默认设置 Use
  • Zsh 无法正确自动完成我的 ssh 命令

    我在 ssh 自动完成方面遇到一些问题 我希望我的 zsh 在我的 ssh config 文件上自动完成 但到目前为止它只对 etc hosts 文件执行此操作 我发现如何通过添加此配置来不使用主机文件 zstyle completion
  • valgrind - 地址 ---- 是分配大小为 8 的块后的 0 字节

    首先 我知道similar已提出问题 但是 我想问一个关于真正原始 C 数据类型的更一般的简单问题 所以就是这样 In main c我调用一个函数来填充这些字符串 int main int argc char argv char host