簡體   English   中英

以下C代碼-結構和指針有什么問題

[英]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; 

}

我在這里注意到兩件事:

  1. 返回的值是本地值的指針。 但是,它仍然是一個指針-編譯器發出警告:函數返回局部變量的地址。 但這真的有問題嗎? (我自己不返回本地值)
  2. 我相信這里的主要問題是此函數假定要復制Data結構。 結果值是可以的,但是關於“下一個”指針,我相信在函數調用結束時指針不會被更改,對嗎? 就像在外部函數*(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; 

}

由調用者分配的指針。

返回指向局部變量的指針的問題是,當函數返回時,局部變量所占用的空間將被回收,因此指針不再指向有效的內存,甚至不再指向以后調用的其他函數使用的內存。

  1. 是的,這將是一個問題,因為返回的指針是無用的:它指向的對象不再存在。 因此,警告。
  2. 不知道我在這里遵循您的推論...您沒有更改傳入的Data任何內容,所以如果您希望這樣做,那就是問題。

1)是的,這是一個問題,因為您的指針現在指向堆棧上的指針,但不再是托管內存,這意味着另一個函數調用(或中斷)將以幾乎100%的確定性開始處理記憶。

2)我不知道你在這里問什么。

主要問題是您不清楚C程序中的內存工作方式,這導致了類似的構造。 並非偶然,只是一個誠實的觀察: http : //www.geeksforgeeks.org/archives/14268提供了一個相對不錯的概述,應該能為您提供良好的服務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM