在这段代码中,我试图创建一个包含所有字符的列表,形成一个输入文件,我的主要问题是句子“你不能返回函数的局部变量”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而不是指向一个返回它的指针吗?
答案 0 :(得分:1)
您无法返回指向函数本地变量的指针。局部变量不超出函数范围({
,}
)
返回函数本地变量的地址将为您提供所谓的未定义行为。
你可以很好地回归:
首先选择第一个,除非你真的因为返回副本而感到困扰。
我可以在没有动态分配的情况下定义列表列表并将其返回吗?
是,
只要你有:
List create(char* path);
答案 1 :(得分:1)
您无法返回函数的局部变量
这句话完全错误。例如,在此功能中:
int f(void)
{
int x = 5;
return x;
}
是一个完全有效的函数,您可以在其中返回一个局部变量。
你应该知道的是你不能(或者更好地说不应该)返回该函数的局部变量的地址。这是因为在函数返回后,地址指向垃圾并且不再可用。
在您的示例中,您可以非常安全地定义本地List
并将其返回。
请注意,您仍然需要动态分配trav
,即您无法将Item
类型的局部变量和list->head
点置于其中,原因与上述相同。< / p>