Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在整个功能过程中保留C内存_C_Memory_Allocation - Fatal编程技术网

在整个功能过程中保留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添加到您的评论中。干杯