在整个功能过程中保留C内存
假设我有一段类似的代码:在整个功能过程中保留C内存,c,memory,allocation,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->
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]->name值在整个函数中应用?确保x永远不为0确保x永远不为0不,您仍然可以使用。丢失该值的唯一方法是,如果在while循环的一次迭代中x为0,或者如果在外部循环中执行malloc而不进入内部循环,则很难判断这是否可能,因为在这两种情况下都没有指定是什么 确实,当您退出某个范围时,在该范围内创建的变量将消失,但这里的情况并非如此。分配的内存将经受范围更改的影响。当您退出外部while语句时,指向该内存的给定指针可能不存在,但在本例中,您的指针info仍在作用域中 我确实看到了另一个潜在的问题-您的mallocsizeofchar**strlenname可能应该是MallocStlenName+1,因为sizeofchar始终是1。这可能是因为一个字符*通常会比一个字符大,但这是错误的做法 但是,我看不到您的代码中有任何地方实际将info->mini[0]->name设置为任何值,因此我不知道它如何能够有一个正确的值,除非它以某种方式从以前的malloc中拾取一个值,这是可能的,因为malloc本身不需要清除它提供给您的内存
您应该发布您的实际代码,或者最好是显示问题的最小代码。不,您仍然可以使用这些代码。丢失该值的唯一方法是,如果在while循环的一次迭代中x为0,或者如果在外部循环中执行malloc而不进入内部循环,则很难判断这是否可能,因为在这两种情况下都没有指定是什么 确实,当您退出某个范围时,在该范围内创建的变量将消失,但这里的情况并非如此。分配的内存将经受范围更改的影响。当您退出外部while语句时,指向该内存的给定指针可能不存在,但在本例中,您的指针info仍在作用域中 我确实看到了另一个潜在的问题-您的mallocsizeofchar**strlenname可能应该是MallocStlenName+1,因为sizeofchar始终是1。这可能是因为一个字符*通常会比一个字符大,但这是错误的做法 但是,我看不到您的代码中有任何地方实际将info->mini[0]->name设置为任何值,因此我不知道它如何能够有一个正确的值,除非它以某种方式从以前的malloc中拾取一个值,这是可能的,因为malloc本身不需要清除它提供给您的内存 您应该发布实际代码,或者最好是显示问题的最小代码。我看到您分配了info->mini[x]->name,然后在下一行打印出来 在这两者之间,您似乎实际上没有将任何数据放入->name,因此我不知道它如何能够打印出正确的值 ->name的分配取决于当时x的值。但是你永远不会让我们看到x被声明,或者它的值被设置 请向我们展示有关x的声明和分配以及数据实际复制到->名称中的位置的信息。我看到您分配了信息->迷你[x]->名称,并在下一行打印出来 在这两者之间,您似乎实际上没有将任何数据放入->name,因此我不知道它如何能够打印出正确的值 ->name的分配取决于当时x的值。但是你永远不会让我们看到x被声明,或者它的值被设置
请向我们展示有关x的声明和赋值以及数据实际复制到->name中的位置的信息。我建议您使用glib的g_strdup函数,请参阅-您将在glib中找到许多有用的函数来处理字符串: 因此,在您的情况下,要复制字符串名称,您只需执行以下操作
info->mini[x]->name = g_strdup(name);
编辑
正如评论所说。。。您可以使用standard获得相同的功能:
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是sizeofchar,因为字符串是char数组,而不是char*,正如您之前所做的那样+1是为以null结尾的字符保存最后一个字符。我建议您使用glib的g_strdup函数,请参阅-您将在glib中找到许多有用的函数来处理字符串: 因此,在您的情况下,要复制字符串名称,您只需执行以下操作
info->mini[x]->name = g_strdup(name);
编辑
正如评论所说。。。您可以使用standard获得相同的功能:
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是sizeofchar,因为字符串是char数组,而不是char*,正如您之前所做的那样+1是为以null结尾的字符保存最后一个字符。这非常混乱。给出一些正确的代码。当其他人看到mallocsizeofchar**n时,他们的钟不会响吗?这里很乱。给出一些正确的代码。当其他人看到mallocsizeofchar**n时,他们的钟声没有响起吗?名称buf是在循环中分配的,因此在某个阶段x必须为零。他的代码太混乱和不完整,无法做出任何有价值的假设。仅使用mallocstrlenname+1是我所知道的动态分配字符串的唯一合理习惯用法…名称buf是在循环中分配的,因此在某个阶段x必须为零。他的代码太凌乱和不完整,无法做出任何有价值的假设。就我所知,使用mallocstrlenname+1是动态分配字符串的唯一合理习惯用法……或者,由于大量C实现都有strdup,所以改用它。或者,如果您的实现没有,只需编写一个,而不必费心尝试合并glib。使用glib有很多很好的理由,像strdup这样的琐碎小事不是其中之一:-当然@paxdiablo,我的观点是glib中有很多有用的函数来处理字符串。但是,我同意你的看法,glib还有很多其他功能,使它成为一个非常有用的库。对答案进行了编辑,以表明仅使用普通strdup也是一个不错的选择。和+1添加到您的评论中。干杯。或者,因为大量的C实现都有strdup,所以改用它。或者,如果您的实现没有,只需编写一个,而不必费心尝试合并glib。使用glib有很多很好的理由,像strdup这样的琐碎小事不是其中之一:-当然@paxdiablo,我的观点是glib中有很多有用的函数来处理字符串。但是,我同意你的看法,glib还有很多其他功能,使它成为一个非常有用的库。对答案进行了编辑,以表明仅使用普通strdup也是一个不错的选择。和+1添加到您的评论中。干杯