我不熟悉指標的使用,我正在嘗試撰寫一個程式來學習使用它們。我有一個問題問你。我有一個檔案lib.h,在其中我定義了 main.js 中所有必要的功能。在這個檔案中,我有一個簡單的資料struct:
struct Slave
{
char **all_samples;
int number_of_samples;
char **last_samples;
int *RSSI;
int *AGC;
int *AUTH;
};
如您所見,此結構的成員是指標(指向 int 的指標、指向指標的指標等)。在同一個檔案中,我有幾個函式。為簡單起見,考慮其中之一。在這個函式中,我從一個檔案中讀取了幾行并將它們放入陣列字串中all_samples(i是先前正確計算的行數):
struct Slave *read_slaves_file(char *file_path, char *slave)
{
...
struct Slave *slave_ptr = malloc(sizeof(struct Slave *));
slave_ptr->all_samples = malloc(i * sizeof(char *));
slave_ptr->all_samples = all_samples;
return slave_ptr;
}
我省略了代碼中不相關的部分(我的問題更具理論性,我的程式中沒有錯誤)。如您所見,我回傳一個指向結構的指標,因此,在 main 內部:
#include "lib.h"
int main(){
struct Slave *slave_1 = malloc(sizeof(struct Slave *));
slave_1 = read_slaves_file(FILE_PATH, SLAVE_1);
return 0;
}
一切似乎都很好......但是,我有一個疑問。在前一個函式內部動態分配的所有記憶體:
struct Slave *slave_ptr = malloc(sizeof(struct Slave *));
slave_ptr->all_samples = malloc(i * sizeof(char *));
應該在哪里解除分配?是否應該解除分配?我想在回傳指標之前我不能釋放記憶體。那么,該怎么做呢?
uj5u.com熱心網友回復:
我的程式沒有錯誤
你有很多錯誤。
-
struct Slave *slave_1 = malloc(sizeof(struct Slave *)); slave_1 = read_slaves_file(FILE_PATH, SLAVE_1);這會重新分配
slave_1創建記憶體泄漏。在呼叫者和函式內部分配記憶體是沒有意義的。下定決心在哪里進行分配。 malloc(sizeof(struct Slave *))這應該是malloc(sizeof(struct Slave))或者如果您愿意的話malloc(sizeof(*slave_1))。相同的錯誤存在于多個地方。slave_ptr->all_samples = malloc(i * sizeof(char *));
slave_ptr->all_samples = all_samples;和以前一樣的錯誤。通過使用賦值運算子,您可以復制指標或復制資料。除非您更改運算元的型別,否則它不能同時做這兩件事。在這一點上,我將退出動態分配并研究指標是如何作業的,特別是非正式地稱為“軟拷貝”與“硬拷貝”的東西。
應該在哪里解除分配?
最好的選擇是始終讓呼叫者進行分配并讓它們提供指向緩沖區的指標,以便函式填滿。這將分配與演算法分開。但是,這可能并不總是一種選擇。
另一個好的設計是讓分配某些東西的代碼模塊也負責清理自己的爛攤子。因此,如果您的 lib 提供了一個回傳指向動態分配資料的指標的函式,那么同一個 lib 還應該提供另一個函式來清理該資料。
一些設計不太好的函式回傳一個指標并期望呼叫者清理它(例如參見 POSIX getline)。這是有問題的,但如果你正確記錄呼叫者負責清理,你就可以僥幸逃脫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/509960.html
標籤:数组C指针记忆结构
