我在我的 C 應用程式中使用 C 庫。其中一個功能需要一個null terminated array of pointers.
由于我使用的是 C ,因此我將陣列的元素存盤在std::vector.
我想知道簡單地呼叫data()我的向量并將結果傳遞給庫函式是否安全。
例子:
std::vector<struct A *> vec;
//library_function(struct A **array);
library_function(vec.data());
當然,如果我更改了向量中的元素,那么回傳的指標data()將失效,但這不是問題(我可以在更新向量時再次呼叫該函式)。
我只是害怕這可能是未定義的行為,因為我看不到任何提到data()的由空指標而不是隨機垃圾終止的地方。
標準確實說:
const T* data() const noexcept;
Returns pointer to the underlying array serving as element storage.
The pointer is such that range [data(); data() size()) is always a valid range
所以有一個終止元素,但沒有說明該元素是否已初始化,如果已初始化,則使用什么值。
它是否在我錯過的其他地方指定?
還是我必須分配一個原始陣列并自己終止它?
uj5u.com熱心網友回復:
如果向量的最后一個元素為空,則指標向量以空終止。最后一個元素之后沒有額外的 null 元素(就像 a 的最后一個元素之后會有一個 null 終止符std::string)。向量的最后一個元素不會自動為空。如果需要最后一個元素為空,則必須插入空元素。
例子:
std::vector<A> vec_of_struct(size);
std::vector<A*> vec_of_ptrs;
vec_of_ptrs.reserve(size 1);
std::ranges::copy(
std::views::transform(
vec_of_struct,
[](A& a) { return &a; }
),
std::back_inserter(vec_of_ptrs)
);
vec_of_ptrs.push_back(nullptr); // null terminator pointer
library_function(vec_of_ptrs.data()); // C function
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/436693.html
上一篇:C 懸空指標問題
下一篇:右值參考轉發
