以下功能有问题:
typedef struct Data1{
float result;
struct Data1* next;
} Data;
Data* f(Data* info){
Data item;
item.result=info->result;
item.next=info->next;
return &item;
}
我在这里注意到两件事:
*(item.next)=*(info->next);
应该解决问题吗?那么这里的主要问题是什么?是1还是2?
答案 0 :(得分:9)
返回的值是本地值的指针。但它仍然是一个指针 - 编译器发出警告:函数返回局部变量的地址。但它真的会成为一个问题吗? (我本身不返回本地值)
这是主要问题。函数返回后,局部变量不再存在。它占用的空间可能会立即或稍后被覆盖,但您不能指望从该地址读取有意义的数据。
如果要复制内容,则必须返回指向malloc
内存的指针。
Data* f(Data* info){
Data *item = malloc(sizeof *item);
item->result=info->result;
item->next=info->next;
return item;
}
但这有一个缺点,即现在调用者必须free
由f
分配的内存,所以
Data* f(Data* info, Data* item){
item->result=info->result;
item->next=info->next;
return item;
}
使用调用者分配的指针。
答案 1 :(得分:3)
返回指向局部变量的指针的问题是,当函数返回时,将回收局部变量占用的空间,因此指针不再指向有效内存,甚至不再指向稍后调用的其他函数使用的内存。
答案 2 :(得分:1)
Data
中的任何内容,所以如果你期望的话,那就是一个问题。答案 3 :(得分:0)
1)是的,这是一个问题,因为你的指针现在指向你曾经在你的堆栈上,但不再是托管内存,这意味着另一个函数调用(或中断)将几乎100%确定,开始破坏那段记忆。
2)我不知道你在这里问什么。
主要的问题是你不清楚C程序中的内存是如何工作的,导致这样的结构;不是一个叮当,只是一个诚实的观察:http://www.geeksforgeeks.org/archives/14268提供了一个相对较好的概述,应该为你服务。