将glist指针作为参数传递以反映列表中的更改不起作用

时间:2015-08-04 07:35:55

标签: c function pointers argument-passing glib

我想将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()函数。我怎样才能做到这一点?

3 个答案:

答案 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)

有很多方法可以做到这一点。一种方式:

  1. 此行GSList *list1 = NULL;创建一个指针,而不是GSList结构。您可能希望使用malloc为列表分配内存并将其强制转换为GSList。例如,GSList list1 = (GSList) malloc(sizeof(GSList));
  2. 然后在您的函数line_parser中,我们需要传递指针line_parser(str, &list1)

    请记住free(list1)

  3. 另一种方法是在堆栈上创建GSList。无论如何,我们仍然将指针传递给line_parser,如上所述。