1

我有一个函数可以将一个项目添加到我创建的列表中。如果是第一次并且列表指向NULL,它分配列表并完成它,返回地址。如果不是第一次,它会添加另一个项目并再次返回第一个项目(现在我可以忽略这个返回)。列表和函数工作正常,这是原型:

typedef struct structTAppConsoleList {
    char *text;
    void (*cbFunction)(int);
    int number; // This is the item number
    struct structTAppConsoleList *previous;
    struct structTAppConsoleList *next;
} TList;

TList *AppConsoleListAddItem(TList *p_list, const char *p_string, void (*p_funcPtr)(int));

因此,在我的代码中的某个地方,我必须创建很多它们,并且我正在尝试按照下面的代码所示进行制作。问题是,我无法让它工作......我想创建一些东西来对我想要创建的列表进行分组,然后在函数中使用它。下面的代码是我想要做的事情的一个想法。仅考虑我尝试分配 3 个列表的部分,其余部分对于此示例并不重要。

TList *list1;
TList *list2;
TList *list3;

int main(void)
{
    int i,j;
    TList **groupMyLists;
    TList *temp;

    groupMyLists=malloc(sizeof(TList)*3);

    *groupMyLists    =(TList*)&list1;
    *(groupMyLists+1)=(TList*)&list2;
    *(groupMyLists+2)=(TList*)&list3;

    for(j=0;j<3;j++) {
        temp=NULL;
        for(i=0;i<10;i++) {
            temp=AppConsoleListAddItem(temp,"some text",someFunc);
        }
        **groupMyLists=temp; // my make won't let me do this
        groupMyLists++;
    }
}

我很确定这会做到这一点,但我无法编译它。

在我的脑海中,(*groupMyLists)将与(&list1), (&list2),(&list3)相同,与,和(**groupMyLists)相同。那为什么我不能呢?任何人?(list1)(list2)(list3)(**groupMyLists=temp)

我希望我说清楚了!!我很难解释我正在尝试做的这种疯狂......

4

3 回答 3

1

更改此行,您使用了错误的间接方式。

*groupMyLists=temp;
于 2012-11-22T22:14:15.830 回答
0

这将完成这项工作:

**groupMyLists = *temp;

将引用的一个结构复制到引用的temp另一个结构*groupMyLists

但只有在*groupMyLists引用任何有效内存的情况下才会这样做 - 至少不是来自您发布的来源。

于 2012-11-22T22:39:12.267 回答
0

除了上述关于不正确间接的两个答案之外,**groupMyLists您可能还想为指针分配list1,list2,list3正确的指针值,而不是将垃圾值写入分配的内存中,groupMyLists

TList * groupMyList = malloc(sizeof(TList)*3);

list1 = &groupMyList[0];
list2 = &groupMyList[1];
list3 = &groupMyList[2];

但是,这与您的其余代码并不匹配,因为它似乎AppConsoleAddListItem分配了temp列表,因此在这种情况下,您malloc将是不正确的,因为它应该为指针分配空间而不是为列表分配空间,如下所示:

TList ** groupMyList = (TList **)malloc(sizeof(TList *)*3);
TList *  temp;

if (!groupMyList) {
   /* Print allocation error warning or handle in some proper fashion */
   exit(1);
}

for(j=0;j<3;j++) {
    temp=NULL;
    for(i=0;i<10;i++) {
        temp=AppConsoleListAddItem(temp,"some text",someFunc);
    }
    groupMyLists[j]=temp; // Here you now assign the pointer in temp to the memory for                           // pointers that you allocated above
}

list1 = groupMyList[0]; // Here we need to assign the list1,2,3 after the AppConsole calls
list2 = groupMyList[1]; // as these calls will changes the pointer addresses written into
list3 = groupMyList[2]; // groupMyList

虽然我不能确定你到底想做什么,但你的原始代码中有几个指针和间接的不一致,上面两个例子希望能提供一些指导

于 2012-11-22T22:48:58.270 回答