【发布时间】: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]内容的部分(我想使用strcpy和strcat)。 -
另外,请说明您是如何初始化
src_path和project_path指针的,以及它们指向的数据内容。
标签: c arrays pointers struct malloc