在整个功能中保留C存储器

时间:2010-10-27 06:52:57

标签: c memory allocation

假设我有一段类似于此的代码:

SOMESTRUCTURE *info;
info = malloc(sizeof(SOMESTRUCTURE));

while(something...)
{
     info->mini[0] = malloc(sizeof(SOMESTRUCTURE *)); // It's a structure inside the same structure
     while(something...)
     {
           info->mini[x]->name = malloc(sizeof(char *)*strlen(name));
           printf("%s\n", info->mini[0]->name); // This prints out the correct value
     }
}

printf("%s\n", info->mini[0]->name); // But now the value is lost and is null

如何在整个功能中应用info-> mini [0] - >名称值?

4 个答案:

答案 0 :(得分:3)

不,那应该仍然可以使用。唯一可能丢失该值的方法是xwhile循环的一次迭代中为{0},或者如果在外循环内执行malloc而不进入内循环 - 很难说这是否可行,因为在这两种情况下你都没有指定something

在退出该范围时,在某个范围内创建的变量确实会消失,但这不是这种情况。分配的内存将在范围更改后继续存在。给定内存的给定指针可能没有,但是在这种情况下你的指针(info在退出外部while语句时仍然在范围内)。

我确实看到了另一个潜在的问题 - 您的malloc(sizeof(char *) * strlen(name))应该是malloc(strlen(name) + 1)(因为sizeof(char)始终是1)。它可能有效,因为char *通常会比char大,但它仍然是错误的做法。

但是,我无法在代码中的任何地方看到您实际设置 info->mini[0]->name的任何内容,所以我不知道它是如何拥有正确的值,除非它是以某种方式从前一个malloc中获取一个值(这是可能的,因为malloc本身不需要清除它给你的内存。)

您应该发布您的实际代码,或者最好是发布问题的最小代码。

答案 1 :(得分:1)

确保x永远不为0

答案 2 :(得分:1)

我建议您使用glib的g_strdup函数,请参阅API - 您可以在glib中找到许多有用的函数来处理字符串:

所以在您的情况下重复字符串name,您只需要...

info->mini[x]->name = g_strdup(name);

<强>被修改 评论时......您可以使用标准strdup来获得相同的功能:

info->mini[x]->name = strdup(name);

最终版

通过这样做,info->mini[x]->name将指向一个动态分配的内存空间,该空间将在您的函数外部可用 - 除非您免费

如果您不想使用glib,那么:

info->mini[x]->name = malloc(sizeof(char) * (strlen(name) + 1));
strcpy(info->mini[x]->name,name);

在这种情况下,请注意malloc是sizeof(char),因为字符串是不是char *的字符数组,就像之前一样。 +1是为null终止char保存最后一个char。

答案 3 :(得分:0)

我看到您分配了info->mini[x]->name,并在下一行打印出来。

在两者之间,你似乎并没有将任何数据放入->name,所以我看不出它是如何打印正确的值的。

->name的分配取决于当时x的值。但是你永远不会告诉我们x被宣布,或者它的值被设定。

请向我们展示有关x的声明和作业以及数据实际复制到->name的位置的信息。