0

以下函数有问题:

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; 

}

我在这里注意到两件事:

  1. 返回值是一个本地值的指针。然而它仍然是一个指针——编译器给出一个警告:函数返回局部变量的地址。但这真的有问题吗?(我本身不返回本地值)
  2. 我相信这里的主要问题是这个函数假设复制数据结构。结果值可以,但是关于“下一个”指针,我相信在函数调用结束时指针不会改变,对吗?这就像在外部函数中均衡两个整数,应该*(item.next)=*(info->next);解决问题吗?

那么这里的主要问题是什么?是1和2吗?

4

4 回答 4

9

返回值是一个本地值的指针。然而它仍然是一个指针——编译器给出一个警告:函数返回局部变量的地址。但这真的有问题吗?(我本身不返回本地值)

这是主要问题。函数返回后,局部变量不再存在。它占用的空间可能会立即或稍后被覆盖,但您不能指望从该地址读取有意义的数据。

如果你想复制东西,你必须返回一个指向malloced 内存的指针。

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; 

}

调用者分配的指针。

于 2012-07-19T12:26:54.987 回答
3

返回局部变量指针的问题在于,局部变量占用的空间会在函数返回时被回收,所以指针不再指向有效内存,甚至不再指向后面调用的其他函数使用的内存。

于 2012-07-19T12:26:39.337 回答
1
  1. 是的,这将是一个问题,因为返回的指针是无用的:它指向一个不再存在的对象。因此发出警告。
  2. 不确定我是否遵循您的推理......您没有更改Data传入的任何内容,所以如果您期望它会出现问题。
于 2012-07-19T12:27:56.837 回答
0

1) 是的,这是个问题,因为你的指针现在指向你的堆栈上的内容,但不再是托管内存,这意味着另一个函数调用(或中断)将几乎 100% 确定地开始修改那个记忆。

2)我不知道你在这里问什么。

主要问题是您不清楚 C 程序中的内存是如何工作的,这导致了这样的构造;不是叮当,只是一个诚实的观察:http ://www.geeksforgeeks.org/archives/14268提供了一个相对较好的概述,应该为您服务。

于 2012-07-19T12:29:26.977 回答