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

passing glist pointer as argument to reflect changes in list does not work

我想将 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;
}

这里我在主函数中有一个列表名称 list1,然后我将 list1 作为参数传递给 lineparser() 函数,其中列表被更改并附加了一些值。我想 return main() 函数的值,但不使用 return 语句,因为我在传递参数时使用了指针引用。但该值未 returned 到 main() 函数。我怎样才能做到这一点?

您似乎想传递列表指针的地址,然后让解析器更新该变量:

void line_parser(char *str,GSList **list1)
{
    ...
    *list1= list;
}

主要是:

main()
{
    GSList *list1 = NULL;
    line_parser(str, &list1);
    ...
}

如上所示,g_slist_append() returns new 列表的起始指针。因此,从本质上讲,您正在尝试更改 line_parser() 中的 list1 值并期望该值反映回 main().

嗯,在目前的形式下这是不可能的。 C 使用按值传递函数参数传递,因此传递给函数的所有参数都是 单独的本地副本 到被调用函数,同时将其视为参数调用函数。

如果要将对list1的更改反映到main(),则需要使用指向指针的指针作为输入参数。

类似

的东西
 void line_parser(char *str,GSList** list1) { //and other usage

 line_parser(str,&list1 );

应该可以解决你的问题。

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

  1. 这一行 GSList *list1 = NULL; 创建了一个指针,而不是 GSList 结构。您可能希望使用 malloc 为列表分配内存并将其转换为 GSList。例如,GSList list1 = (GSList) malloc(sizeof(GSList));

  2. 然后在你的函数中line_parser我们需要传递一个指针line_parser(str, &list1)

    记得free(list1)

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