【问题标题】:How to Use LLIST *mylist[N];如何使用 LLIST *mylist[N];
【发布时间】:2011-01-08 07:49:46
【问题描述】:

我明白了:

LLIST *mylist[N];

其中 N 是输入文件的行数。那么mylist[i]就是指向第i个链表的指针。

我调用一个函数

LLIST *list_add(LLIST **p, int i){
    LLIST *n;

    n = (LLIST *) malloc(sizeof(LLIST));

    if (n == NULL)
        return NULL;

    n->next = *p; /* the previous element (*p) now becomes the "next" element */
    *p = n;       /* add new empty element to the front (head) of the list */
    n->data = i;
    return p;
}

所以在我的主要内容中我会说类似

LLIST *mylist[N];
list_add(&mylist[0],1);
list_add(&mylist[0],2);
list_add(&mylist[1],3)
list_add(&mylist[1],4);
list_print(mylist[0]); // Print mylist[0]
list_print(mylist[1]); // Print mylist[1]

我的 Print_list 函数是:

Void *list_print(LLIST *n) {
    if (n == NULL){ 
        printf("list is empty\n");
    }

    while (n != NULL){
        printf("%d",n->data); 
        n = n->next;
    }
}

当我执行list_print(mylist[0]) 时,它会打印出2 1

当我执行list_print(mylist[1]) 时,出现分段错误。

发生了什么事?

【问题讨论】:

  • 你是不是和 jmh86 同班:stackoverflow.com/questions/2106691/…?或者可能不是。您提出问题并在第一行询问INTLIST,但其余代码使用LLIST,您还没有向我们展示其中任何一个是如何构建的。请提供更多细节。
  • 此外,使用调试器运行以查看它在哪一行出现故障总是值得的。 (使用 gcc 编译和链接时使用 -g,在类 unix 环境中使用 gdb programname。)
  • 抱歉之间的混淆。它应该是 LLIST,而不是 INTLIST。
  • 最后,通常这样标记作业,不是因为作业问题有什么问题,而是因为它可以帮助我们猜测您需要什么样的帮助。

标签: c arrays pointers linked-list


【解决方案1】:

您似乎没有初始化mylist 数组的内容,它可能包含指向随机内存位置的值。当只是添加新元素时,这并不重要,新元素会在开头插入,从不访问无效指针。但是当你尝试打印列表时,打印函数会跟随列表末尾的无效指针并产生分段错误。

为避免这种情况,在数组声明中添加一个初始化器:

LLIST *mylist[N] = {NULL};

这会将mylist 的所有元素设置为NULL

【讨论】:

  • 对我们给出的最佳猜测,除了stackoverflow.com/questions/2106691/… 似乎有一个特殊的第一个节点初始化函数。
  • 好吧,我将它初始化为 LLIST mylist*[2];每次我运行这个我都会得到不同的结果。它现在正在打印 *mylist[1];但是当我打印 mylist[0];它打印 2 1 1(重复 1);
  • LLIST *mylist[N] = {NULL};修复了我猜的问题..我需要做更多的测试。不过我不自信。
  • @MRP: LLIST *mylist[2] decalares mylist 是LLIST*s 的未初始化 两元素数组。但此时mylist[0]mylist[1] 的值可能是anything。在那一点(没有设置)访问它们到已知的东西会调用未定义的行为。您有患鼻恶魔的风险。
  • 好吧,我已经使用此代码对其进行了测试,它确实打印出了正确的: int main(void) { int i,j; LLIST *mylist[10] = {NULL}; for(i=0; i
【解决方案2】:

这确实有效 LLIST *mylist[10] = {NULL}; 但是如果我想这样做我会得到错误:

x=10; LLIST *mylist[x] = {NULL};

【讨论】:

    猜你喜欢
    • 2011-01-08
    • 2011-01-08
    • 2015-12-09
    • 2023-02-24
    • 2015-08-16
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多