以下C代码 - 结构和指针有什么问题

时间:2012-07-19 12:23:35

标签: c pointers struct

以下功能有问题:

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. 我认为这里的主要问题是这个函数假设要复制Data结构。结果值是可以的,但对于'下一个'指针,我相信在函数调用结束时指针不会被改变,我是否正确?这就像在外部函数中均衡两个整数,*(item.next)=*(info->next);应该解决问题吗?
  3. 那么这里的主要问题是什么?是1还是2?

4 个答案:

答案 0 :(得分:9)

  

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

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

如果要复制内容,则必须返回指向malloc内存的指针。

Data* f(Data* info){
    Data *item = malloc(sizeof *item);
    item->result=info->result;
    item->next=info->next;

    return item; 

}

但这有一个缺点,即现在调用者必须freef分配的内存,所以

Data* f(Data* info, Data* item){
    item->result=info->result;
    item->next=info->next;

    return item; 

}

使用调用者分配的指针。

答案 1 :(得分:3)

返回指向局部变量的指针的问题是,当函数返回时,将回收局部变量占用的空间,因此指针不再指向有效内存,甚至不再指向稍后调用的其他函数使用的内存。

答案 2 :(得分:1)

  1. 是的,这将是一个问题,因为返回的指针是无用的:它指向一个不再存在的对象。因此警告。
  2. 我不确定我在这里遵循你的推理......你没有改变传入的Data中的任何内容,所以如果你期望的话,那就是一个问题。

答案 3 :(得分:0)

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

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

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