我想将glist指针传递给函数,以便我可以在main函数中获取更改的值。
我的代码为:
#include <stdio.h>
#include <string.h>
#include <glib.h>
char *col_trim_whitespace(char *str)
{
char *end;
// Trim leading space
while(isspace(*str)) str++;
if(*str == 0) // All spaces?
return str;
// Trim trailing space
end = str + strlen(str) - 1;
while(end > str && isspace(*end)) end--;
// Write new null terminator
*(end+1) = 0;
return str;
}
void line_parser(char *str,GSList* list1)
{
GSList* list = NULL;
char *token, *remstr=NULL ;
token = strtok_r(str,"\n",&remstr);
while(token != NULL)
{
if(token[0] == ' ')
{
token = col_trim_whitespace(token);
if(strcmp(token,"")==0)
{
token = strtok_r(NULL, "\n", &remstr);
continue;
}
}
list1 = g_slist_append(list1, token);
token = strtok_r(NULL,"\n",&remstr);
}
}
int main()
{
int *av,i,j,length;
i=0;
char str[] = " this name of \n the pet is the ffffffffffffffffffffffffffffff\n is \n the \n test\n program";
//GSList *list1 = line_parser(str);
GSList *list1 = NULL;
line_parser(str,list1 );
// printf("The list is now %d items long\n", g_slist_length(list));
length = g_slist_length(list1);
// printf("length=%d", length);
for(j=0;j<length;j++)
{
printf("string = %s\n",(char *)g_slist_nth(list1,j)->data);
}
g_slist_free(list1);
return 0;
}
这里我在main函数中有一个列表名list1
,然后我将list1
作为参数传递给lineparser()
函数,其中列表被更改,附加了一些值。我想将值返回到main()
函数但不使用return
语句,因为我在传递参数时使用了指针引用。但该值不会返回main()
函数。我怎样才能做到这一点?
答案 0 :(得分:3)
似乎你想传递列表指针的地址,然后让解析器更新该变量:
void line_parser(char *str,GSList **list1)
{
...
*list1= list;
}
并在主要:
main()
{
GSList *list1 = NULL;
line_parser(str, &list1);
...
}
答案 1 :(得分:2)
如图所示,g_slist_append()
返回列表的 new 开始指针。因此,基本上,您尝试更改list1
中的line_parser()
值并期望将该值反映回main()
。
嗯,目前的形式是不可能的。 C
使用pass-by-value进行函数参数传递,因此传递给函数的所有参数都是单独的本地副本到被调用函数,同时考虑作为被调用函数的参数。
如果要将list1
的更改反映到main()
,则需要使用指针指针作为输入参数。
中的某些内容
void line_parser(char *str,GSList** list1) { //and other usage
和
line_parser(str,&list1 );
应该解决你的问题。
答案 2 :(得分:1)
有很多方法可以做到这一点。一种方式:
GSList *list1 = NULL;
创建一个指针,而不是GSList
结构。您可能希望使用malloc
为列表分配内存并将其强制转换为GSList
。例如,GSList list1 = (GSList) malloc(sizeof(GSList));
然后在您的函数line_parser
中,我们需要传递指针line_parser(str, &list1)
请记住free(list1)
另一种方法是在堆栈上创建GSList
。无论如何,我们仍然将指针传递给line_parser
,如上所述。