0

在这段代码中,我试图创建一个列表,其中包含输入文件中的所有字符,我的主要问题是句子“你不能返回函数的局部变量”我被告知哪个让我很困惑。我动态分配了一个 List 并返回它,我可以在List list没有动态分配的情况下定义并返回它吗?我相信这是错误的,因为所有信息都会被自动删除,我只会留下我创建的原始列表的地址。

以下是更多信息的代码:

typedef struct Item {
    char tav;
    struct Item* next;
} Item;

typedef struct List {
    Item* head;
} List;

List* create(char* path) {
    FILE* file;
    List* list;
    Item* trav;
    Item* curr;
    char c;

    file=fopen(path, "r");
    if (file==NULL) {
        printf("The file's not found");
        assert(0);
    }

    if (fscanf(file, "%c", &c)!=1) {
        printf("The file is empty");
        assert(0);
    }
    trav=(Item *)calloc(1, sizeof(Item));
    trav->tav=c;
    list=(List *)calloc(1, sizeof(List)); /* allocating dynamiclly the list so it won't be lost at the end of the function*/
    list->head=trav;

    while (fscanf(file, "%c", &c)==1) {
        curr=(Item*)calloc(1, sizeof(Item));
        curr->tav=c;
        trav->next=curr;
        trav=curr;
    }
    trav->next=NULL;

    fclose(file);

    return list;

}

我对么?这是必要的吗?我可以定义 List 而不是一个指向一个返回它的指针吗?

4

2 回答 2

1

您不能返回指向函数本地变量的指针。局部变量不会超出函数的作用域({, })。
返回函数局部变量的地址将为您提供所谓的未定义行为

您可以很好地返回:

  • 按值或局部变量
  • 指向动态分配内存的指针

首选第一个,除非您真的因为返回副本而对内存过多感到困扰。

我可以只定义没有动态分配的列表列表并返回它吗?

是的,
只要您有:

List create(char* path); 
于 2012-09-17T11:29:57.403 回答
1

您不能返回函数的局部变量

这句话是完全错误的。例如在这个函数中:

int f(void)
{
    int x = 5;
    return x;
}

是一个完全有效的函数,您将在其中返回一个局部变量。

您应该知道的是,您不能(或者说不应该)返回函数的局部变量的地址。这是因为函数返回后,地址指向垃圾,不再可用。

在您的示例中,您可以非常安全地定义一个本地List并返回它。

请注意,您仍然需要动态分配,即出于与上述相同的原因,trav您不能获取类型的局部变量Item并指向它。list->head

于 2012-09-17T11:30:38.770 回答