动态分配并返回局部变量

时间:2012-09-17 11:28:06

标签: c variables dynamic

在这段代码中,我试图创建一个包含所有字符的列表,形成一个输入文件,我的主要问题是句子“你不能返回函数的局部变量”Iv'e被告知这让我非常困惑。我动态分配了一个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而不是指向一个返回它的指针吗?

2 个答案:

答案 0 :(得分:1)

您无法返回指向函数本地变量的指针。局部变量不超出函数范围({}) 返回函数本地变量的地址将为您提供所谓的未定义行为

你可以很好地回归:

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

首先选择第一个,除非你真的因为返回副本而感到困扰。

  

我可以在没有动态分配的情况下定义列表列表并将其返回吗?

是,
只要你有:

List create(char* path); 

答案 1 :(得分:1)

  

您无法返回函数的局部变量

这句话完全错误。例如,在此功能中:

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

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

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

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

请注意,您仍然需要动态分配trav,即您无法将Item类型的局部变量和list->head点置于其中,原因与上述相同。< / p>