malloc操作清除其他分配的内存

malloc操作清除其他分配的内存,c,arrays,pointers,struct,malloc,C,Arrays,Pointers,Struct,Malloc,我正在尝试制作一个程序,它基本上选取一段特定的源代码,并向其中添加一些其他特定的代码。这个程序太大了,可以把它放在我的问题里,但基本上我有一个“演员”结构: 如您所见,这些几乎都是指针,最后一个是字符串数组。这需要这样做,因为“actor元素”的数量每次都取决于输入 问题:在一个特定的测试用例中,我有一个在actor_path数组中包含'num'成员的用例。然后我第一次这样只给malloc打一次电话: *actors->actor_path = malloc(actors->num)

我正在尝试制作一个程序,它基本上选取一段特定的源代码,并向其中添加一些其他特定的代码。这个程序太大了,可以把它放在我的问题里,但基本上我有一个“演员”结构:

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

问题:在一个特定的测试用例中,我有一个在actor_path数组中包含'num'成员的用例。然后我第一次这样只给malloc打一次电话:

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

(如果在实际程序中成功,则正确测试malloc调用) 这是在为每个“actor\u path”元素调用的函数中调用的。在这个测试示例中,我有三个参与者

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

有人知道这是怎么可能的,为什么可能的吗?我该如何解决这个问题

提前谢谢

编辑:

以下是调试监视窗口中的一些屏幕截图:

第一次打电话给malloc:一切正常

第二次打电话给malloc:一切正常


对malloc的第三次调用:src\u路径被删除

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

actors_s *actor = malloc(sizeof(*actor) + sizeof(char*) * num);
然后,只需将最多
num
个元素分配到
actor\u path
(每个元素都指向char)。

  • 关于
    *actors->actor\u path=malloc(actors->num)

    actors->actor\u path
    是一个指针数组,因此
    *actors->actor\u path
    actors->actor\u path
    中的第一个指针,即
    actors->actor\u path[0]

    执行此操作时,实际上为
    actors->actor\u路径[0]
    分配
    actors->num
    字节内存

    现在,访问
    actors->actor\u路径[0]
    是可以的,而访问
    actors->actor\u路径[1]
    actors->actor\u路径[2]
    actors->actor\u路径[3]
    ,。。。可能会导致问题,例如,重写
    src\u路径

  • 关于解决方案

    @凯尔塔是对的。通过这种方式,
    角色->角色路径[0]
    角色->角色路径[1]
    角色->角色路径[2]
    ,…,
    角色->角色路径[num-1]
    的资源被正确分配


您的第一次分配应该类似于
actors->actor\u path=malloc(actors->num*sizeof(char*))
,因为您需要为
num
指针留出空间;尽管
calloc(actors->num,sizeof(char*))
可能会更好,因为它也会将内存归零,所以您可以从空指针开始,而不是随机指针。您不需要
*
。。如果您得到的错误没有它,请告诉我们。我得到的错误没有“*”是:错误:灵活数组成员的使用无效您有
valgrind
可用吗?如果是,就用它。如果不可用,请使其可用,或者在可用的系统中使用。代码中存在多个错误。为了获得问题的完整答案,请添加您填写
actors->actor\u path[i]
(我想使用
strcpy
strcat
)内容的部分。此外,请准确说明您是如何初始化这些
src\u path
project\u path
指针的,以及它们指向的数据内容。已修复!这和你说的不完全一样,但它确实做到了:struct actors\u s actors=malloc(sizeof(actors\u s)+sizeof(char)*num);非常感谢你,伙计!
int size = strlen(name)+strlen(actors->project_path)+strlen("/src/")+strlen(".c")+4;
actors->actor_path[i] = malloc(size);
actors_s *actor = malloc(sizeof(*actor) + sizeof(char*) * num);