[英]What's wrong with the following C code- Struct and pointers
以下功能有問題:
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);
兩個整數相等,應該*(item.next)=*(info->next);
解決這個問題? 那么這里的主要問題是什么? 是1還是2?
返回的值是本地值的指針。 但是,它仍然是一個指針-編譯器發出警告:函數返回局部變量的地址。 但這真的有問題嗎? (我自己不返回本地值)
那是主要問題。 函數返回后,局部變量不再存在。 它所占用的空間可能會立即或稍后被覆蓋,但是您不能指望從該地址讀取有意義的數據。
如果要復制內容,則必須返回指向已分配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;
}
由調用者分配的指針。
返回指向局部變量的指針的問題是,當函數返回時,局部變量所占用的空間將被回收,因此指針不再指向有效的內存,甚至不再指向以后調用的其他函數使用的內存。
Data
任何內容,所以如果您希望這樣做,那就是問題。 1)是的,這是一個問題,因為您的指針現在指向堆棧上的指針,但不再是托管內存,這意味着另一個函數調用(或中斷)將以幾乎100%的確定性開始處理記憶。
2)我不知道你在這里問什么。
主要問題是您不清楚C程序中的內存工作方式,這導致了類似的構造。 並非偶然,只是一個誠實的觀察: http : //www.geeksforgeeks.org/archives/14268提供了一個相對不錯的概述,應該能為您提供良好的服務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.