此代碼按預期工作:訪問指向空向量元素的指針是未定義的行爲嗎?
std::vector<unsigned char> tab;
if(!&tab[0])std::cout<<"null";
但我不知道這是否是合法的對待&tab[0]
爲空時,矢量是空的。
我期待的是&tab[0]
爲空,如果矢量爲空或不是空的。
這只是這樣我就可以把它傳遞給接受const unsigned char*
此代碼按預期工作:訪問指向空向量元素的指針是未定義的行爲嗎?
std::vector<unsigned char> tab;
if(!&tab[0])std::cout<<"null";
但我不知道這是否是合法的對待&tab[0]
爲空時,矢量是空的。
我期待的是&tab[0]
爲空,如果矢量爲空或不是空的。
這只是這樣我就可以把它傳遞給接受const unsigned char*
我不知道,如果你的意思未初始化(向量元素)或(初始化向量)元素,但你的例子是一個函數都不是。這是一個零元素的初始化向量。
a.operator[n]
被定義爲具有*(a.begin()+n)
的語義,並且對於空向量的begin = end,您將解引用末端迭代器。行爲是未定義的。
您編寫代碼的方式肯定涉及到未定義的行爲,並且是不好的做法,因爲它訪問未初始化的內存。
然而,這將是完美的罰款和法律:
std::vector<unsigned char> tab(1);
if(!&tab[0])std::cout<<"null";
即使tab[0]
一直沒有分配給它的值,指針有內存的有效部分以指向。我不記得是否有關於值的tab[0]
的任何保證,但這對您寫的代碼並不重要。
當然,這是UB。 –
元素不是未初始化的。它不存在。 – LogicStuff
@LogicStuff:'uninitialize vector'元素 – Jahid