1樓:陳昱
如果是new出來的話,有可能找到,想想delete array時,系統是如何知道需要delete的長度的呢?一種說法是array指標的位址前面的位址,有儲存該陣列大小的資訊,於是可以獲取到了,具體不確定
2樓:
c語言的情況下,老老實實的把長度帶上。
就好比你給搬家公司的人說我要搬家,然後人家說我派一輛車過去,你覺得這會有什麼問題?
3樓:
樓上回答很精彩,我試著從理論解釋一下。乙個變數,通常包含兩種屬性,乙個是型別,乙個是操作。型別決定了大小和操作方式。
指標也是變數,其兩個屬性沒辦法決定陣列的長度的。另外,陣列沒辦法做引數,即使有,一律轉為指標。所以要傳遞陣列大小,需要另外的屬性,也就是另外的引數咯。
4樓:pansz
C 語言跟 C++ 是不同的。最大的不同之處在於,它不會象變魔法般的在後台以程式設計師不知道的方式新增一些奇奇怪怪的東西。——這可能是好事,也可能是壞事,取決於你在什麼領域進行程式設計。
乙個陣列就是一串串行,它的位址以及儲存的內容都一目了然在那裡了,沒有任何地方記錄了有關其「長度」的資訊。所以你自然沒有辦法知道它的長度。資訊都儲存在記憶體中,你能獲取乙個資訊就意味著這個資訊或者用來推算這個資訊的相關資訊必須被儲存在記憶體中的某個地方,你能知道乙個陣列的長度就必須有某個地方儲存了這個陣列的長度資訊。
題主要的是有某個「魔法」的方法知道乙個指標指向的內容的長度,但如果你根本沒有在任何地方儲存它的長度,沒有人知道,又如何能獲取?
所以,傳遞長度本質上來說就這麼幾個辦法,1,單獨傳乙個長度引數,(C方式),或者對資料內容進行約定(C字串方式),2,把資料報裝成乙個結構,結構中有乙個欄位是長度,另外乙個欄位是資料內容,同時在新增一些其他的字段作為控制資訊等(C++方式)。3,其他各種黑科技,使用這些黑科技一般會造成程式不可移植,只能適用於特定場合。
5樓:haoshu zhao
你可以規定陣列的前若干個位元組用來儲存這個陣列的長度,用的時候偏移一下再用。不過你得自己管理好。或者自己實現乙個類似功能的結構體。
6樓:黃珏珅
輪子哥這樣調戲樓主是不對的:)
c語言裡面通常會多加乙個引數來表示指標指向內容的長度,如:
ssize_t read_from_stream(stream_t* stream, void* buffer, size_t size)
7樓:
指標不帶長度資訊,如果非要帶長度就只能用陣列做引數,不同長度的陣列屬於不同的型別,所以只能用模板函式了,就跟std::begin一樣
std::begin屬於通用的短小函式,不是這個型別的函式是沒必要這樣寫的,這也是"很多庫函式都是另外傳入乙個長度引數"的原因
8樓:
方法有2,都是需要額外的操作約定來完成,不如用通用的傳入個長度的方式。
方法一,在這個指標指向的陣列的前面放陣列大小。
template
void Func(T* data)
這樣就取到了長度,初始化的時候需要額外管理這個長度。
方法二,參考字串,陣列用某個特定的值作為結束的標誌template
void Func(T* data)
}因此,一般來說還是
template
void Func(T*, size_t length);
簡單快捷
9樓:code42
指標只給出了兩種資訊:所指向資料的型別和位址 。
而根據兩者你是無法判斷該資料的位址範圍的(只知起始位址不知終結位址,另外型別也是無法幫助你的,請自行腦補)。
當然也有一些黑魔法(利用起始位址),具體可參考OOC。
C語言 如何在函式體內,自動判斷傳入的陣列引數的長度。
飛著走的魚 裸陣列 內建 不可以判斷,陣列長度需要傳遞進去。這算是C語言本身的一種風格 要獲得可以判斷長度的陣列,需要自己設計陣列型別,用struct定義,並使用動態分配記憶體。 孔乙己 main函式的一般形式是 main int argc,char argv argc就是後邊那個argv陣列的個數...
c 如何獲取指標指向的byte陣列長度?
Pluto Hades 簡單陣列的指標是沒有陣列總長資訊的,所以必須傳長度。通過陣列名獲取長度請參考bing的回答。都用上C 了,我建議就別搞這種C語法了。你可以封裝乙個byte類。不知道如何下手的話,可以參考一下qt的QByteArray類。 程式設計師檸檬 題目我看了幾遍,不知道我這樣理解對不對...
C語言free 函式是如何釋放指標的?
Reclair 堆記憶體通過移動乙個指標動態擴容。被分配的記憶體和未分配的記憶體的分布是雜合在一起的,經典處理方法是在每一塊已分配 或未分配 的記憶體區塊首部填寫一些相關資訊,例如當前塊是否正在使用 塊的長度 下一塊的位址等等,構成乙個鍊表,malloc 和 free 利用這些頭部資訊在資料塊之間跳...