假设我有一段类似于此的代码:
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] - >名称值?
答案 0 :(得分:3)
不,那应该仍然可以使用。唯一可能丢失该值的方法是x
在while
循环的一次迭代中为{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
的位置的信息。