【问题标题】:malloc operation clears other allocated memorymalloc 操作清除其他分配的内存
【发布时间】:2023-03-30 19:14:02
【问题描述】:

我正在尝试制作一个程序,该程序基本上会选择一段特定的源代码并在其中添加一些其他特定代码。该程序太大了,无法将其全部放在我的问题中,但基本上我有这个“演员”结构:

typedef struct actors_s {
    int num;
    char *src_path;
    char *project_path;
    int *papify;
    char *actor_path[];
} actors_s;

如您所见,这些几乎都是指针,最后一个是字符串数组。这需要以这种方式完成,因为“actor 元素”的数量取决于每次的输入。

问题:在一个特定的测试案例中,我有一个案例,actor_path 数组中有“num”个成员。然后我首先以这种方式只调用一次 malloc:

*actors->actor_path = malloc(actors->num);

我的逻辑告诉我我不应该在这里使用“*”运算符,但没有它我会收到错误,这可能就是问题所在。因此,调用了一个函数,为每个新成员分配一个新的内存空间(永远不会超过 'num' 个成员):

int size = strlen(name)+strlen(actors->project_path)+strlen("/src/")+strlen(".c")+4;
actors->actor_path[i] = malloc(size);

(如果在实际程序中成功,则正确测试 malloc 调用) 这在为每个“actor_path”元素调用的函数内部调用。在这个测试示例中,我有三个演员。

不可思议的是,在第三次调用这个 malloc 时,结构的 src_path 元素在程序开始时被正确分配并设置为一个字符串(并且再也没有触及过)被释放(我想是的,如果我在调试模式下观看它至少会变成随机数和符号)。

任何人都知道如何以及为什么会这样?我该如何解决这个问题?

提前致谢。

编辑:

以下是调试监视窗口的一些屏幕截图:http://imgur.com/a/aB1uv

第一次调用 malloc:一切正常。

第二次调用 malloc:一切正常。

第三次调用 malloc:src_path 被删除!

【问题讨论】:

  • 您的第一个分配应该类似于actors->actor_path=malloc(actors->num * sizeof(char*) ),因为您需要num 指针的空间;尽管calloc( actors->num, sizeof(char*) ) 可能会更好,因为它还会将内存归零,因此您可以从 NULL 指针而不是随机指针开始。你不想要* .. 如果没有它就出现错误,请告诉我们。
  • 没有'*'我得到的错误是:错误:灵活数组成员的无效使用
  • 您有valgrind 可用吗?如果是这样,请使用它。如果没有,请使其可用,或使用可用的系统。
  • 您的代码中有几个错误。为了得到您问题的完整答案,请添加您填写actors->actor_path[i]内容的部分(我想使用strcpystrcat)。
  • 另外,请说明您是如何初始化src_pathproject_path 指针的,以及它们指向的数据内容。

标签: c arrays pointers struct malloc


【解决方案1】:

[] 在最新的数组元素中称为灵活数组成员。这意味着结构有一个在结构本身之后开始的数组,并且它的大小是未指定的。您必须为此手动分配内存。例如

actors_s *actor = malloc(sizeof(*actor) + sizeof(char*) * num);

然后最多将num 元素分配给actor_path(每个元素都是指向char 的指针)。

【讨论】:

  • 已修复!不完全是你说的,但这样做的伎俩: struct actor_s actors = malloc(sizeof(actors_s)+sizeof(char) * num);非常感谢!
【解决方案2】:
  • 关于*actors->actor_path = malloc(actors->num);

    actors->actor_path是一个指针数组,所以*actors->actor_pathactors->actor_path中的第一个指针,即actors->actor_path[0]

    执行此操作时,您实际上为actors->actor_path[0] 分配了actors->num 字节内存。

    现在,访问actors->actor_path[0] 是可以的,而访问actors->actor_path[1]actors->actor_path[2]actors->actor_path[3]、...可能会出现问题,比如重写src_path...

  • 关于解决方案

    @keltar 是对的。这样actors->actor_path[0]actors->actor_path[1]actors->actor_path[2]、...、actors->actor_path[num - 1]的资源就被正确分配了。

【讨论】:

    猜你喜欢
    • 2012-12-26
    • 1970-01-01
    • 2020-04-20
    • 2013-10-10
    • 2013-02-23
    • 1970-01-01
    • 2010-12-09
    • 2020-12-14
    • 2021-03-13
    相关资源
    最近更新 更多