2016-11-17 61 views
-3

此代碼按預期工作:訪問指向空向量元素的指針是未定義的行爲嗎?

std::vector<unsigned char> tab; 
if(!&tab[0])std::cout<<"null"; 

但我不知道這是否是合法的對待&tab[0]爲空時,矢量是空的。

我期待的是&tab[0]爲空,如果矢量爲空或不是空的。

這只是這樣我就可以把它傳遞給接受const unsigned char*

+5

當然,這是UB。 –

+3

元素不是未初始化的。它不存在。 – LogicStuff

+0

@LogicStuff:'uninitialize vector'元素 – Jahid

回答

3

我不知道,如果你的意思未初始化(向量元素)(初始化向量)元素,但你的例子是一個函數都不是。這是一個零元素的初始化向量。

a.operator[n]被定義爲具有*(a.begin()+n)的語義,並且對於空向量的begin = end,您將解引用末端迭代器。行爲是未定義的。

1

您編寫代碼的方式肯定涉及到未定義的行爲,並且是不好的做法,因爲它訪問未初始化的內存。

然而,這將是完美的罰款和法律:

std::vector<unsigned char> tab(1); 
if(!&tab[0])std::cout<<"null"; 

即使tab[0]一直沒有分配給它的值,指針有內存的有效部分以指向。我不記得是否有關於tab[0]的任何保證,但這對您寫的代碼並不重要。

+0

它不打印null – Jahid

+3

編寫未定義行爲的代碼更糟糕那只是「壞習慣」。 –

+3

*「然而,這將是完美的,合法的:」*沒錯,但不是很有用。 'if'中的東西是死代碼。 –