【问题标题】:Exporting a list from a function从函数中导出列表
【发布时间】:2013-11-21 05:04:27
【问题描述】:

我的 C 语言有问题。

这个 for 循环创建一个包含文件信息的列表。每行“pl”、“pc”和“pv”。

并且也打印每行的信息,3个数字。

================================================ ======

例如。 1

for(i = 0, aux = base->prox; i < p; aux = aux->prox, i++){

    aux = (celula *)malloc(sizeof(celula));
    fscanf(file, "%d %d %d", &(aux->pl) , &(aux->pc), &(aux->pv));
    printf("%d %d %d\n", aux->pl , aux->pc, aux->pv);

}

================================================ ======

在第二个示例中,我将信息从 for 循环中打印出来,但在另一个 for 循环中,它会遍历在前一个 for 循环中创建的列表。

================================================ ======

例如。 2

for(i = 0, aux = base->prox; i < p; aux = aux->prox, i++){

    aux = (celula *)malloc(sizeof(celula));
    fscanf(file, "%d %d %d", &(aux->pl) , &(aux->pc), &(aux->pv));
    /*printf("%d %d %d\n", aux->pl , aux->pc, aux->pv);*/

}

for(aux = base; aux != NULL; aux = aux->prox){

    printf("%d %d %d\n", aux->pl , aux->pc, aux->pv);

}

================================================ ======

现在,问题是:在第一个示例中,它正常打印信息。在第二个例子中,不是像第一个例子那样正常打印信息,而是只打印一行“0 0 0”。

第一个例子和第二个例子有什么不同?它不应该这样做吗?

请帮忙!

【问题讨论】:

    标签: c list for-loop struct


    【解决方案1】:

    尽管第一个示例似乎可以满足您的要求,但它们都存在错误。您不应该每次通过 for 循环都为 aux 分配内存。这将导致内存泄漏并导致您丢失使用 fscanf 读取的值。

    您应该在 for 循环之外为 aux 分配内存。然后使用 for 循环使用 fscanf 将值读入内存。

    【讨论】:

    • 试过这个... aux = (celula *)malloc(sizeof(celula)); for(i = 0, aux = base->prox; i prox, i++){ fscanf(file, "%d %d %d", &(aux->pl) , &(辅助->pc), &(辅助->pv)); /*printf("%d %d %d\n", aux->pl , aux->pc, aux->pv);*/ } 分段错误。
    【解决方案2】:
    for(i = 0, aux = base->prox; i < p; aux = aux->prox, i++){
    
        aux = (celula *)malloc(sizeof(celula));
        fscanf(file, "%d %d %d", &(aux->pl) , &(aux->pc), &(aux->pv));
        /*printf("%d %d %d\n", aux->pl , aux->pc, aux->pv);*/
    
    }
    

    在您的 for 循环中,您正在执行 aux = (celula *)malloc(sizeof(celula));,它会覆盖取自 aux = aux-&gt;proxaux。所以 fscanned 数据进入新分配的内存而不是链表。

    所以当你再次在另一个循环中引用列表时,它没有读取的数据。

    如果已经创建了链表,则不需要在 for 循环中分配 aux。所以从循环中删除malloc()

    for(i = 0, aux = base->prox; i < p; aux = aux->prox, i++){
        //not needed
        //aux = (celula *)malloc(sizeof(celula));
        fscanf(file, "%d %d %d", &(aux->pl) , &(aux->pc), &(aux->pv));
        /*printf("%d %d %d\n", aux->pl , aux->pc, aux->pv);*/
    
    }
    

    如果列表节点未分配,则分配并适当添加到列表中。

    【讨论】:

    • 试过这个... aux = (celula *)malloc(sizeof(celula)); for(i = 0, aux = base->prox; i prox, i++){ fscanf(file, "%d %d %d", &(aux->pl) , &(辅助->pc), &(辅助->pv)); /*printf("%d %d %d\n", aux->pl , aux->pc, aux->pv);*/ } 分段错误。
    • @JoãoFilipe,您如何构建链表似乎有些问题。
    猜你喜欢
    • 2016-10-18
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 2011-02-22
    • 2014-11-21
    • 1970-01-01
    相关资源
    最近更新 更多