2016-10-15 68 views
1

我試圖重現一個問題來問它在這!但我想創建的示例本身就有問題!for循環矢量,總是返回單個索引

正如你看到下面,我寫了接收來自用戶5元一個簡單的程序,並把它們放在一個u_char載體內。之後,我試圖打印矢量的成員。

#include <iostream> 
    #include <vector> 
    #include <stdint.h> 
    #include <netinet/ip.h> 
    #include <netinet/tcp.h> 
    #include <netinet/ether.h> 

    int main(){ 
     std::vector<u_char*> packets; 
     u_char packet[10]; 
     std::cout << "Receiving Values :\n"; 
     for(int i=0; i<5; i++){ 
      std::cin >> packet; 
      packets.push_back(packet); 
     } 

     std::cout << "\n\n\nPrinting Values :\n";                               
     for(auto p : packets){ 
      std::cout << p << "\n"; 
      std::cout << "------------\n"; 
     } 
     return 0; 
    } 

這是輸出:

[email protected]:~/Desktop/test$ ./a.out 
Receiving Values : 
aaaa 
b 
ccccc 
ddd 
ggggggg 



Printing Values : 
ggggggg 
------------ 
ggggggg 
------------ 
ggggggg 
------------ 
ggggggg 
------------ 
ggggggg 
------------ 

爲什麼在輸出中,我只得到了最後一個成員?

回答

4

這是因爲你把一個指向同一個數組指針的vector。這有兩個後果:

  • 所有條目都是相同的,並等於最後一個條目,因爲指針總是相同的;數據不會被複制到矢量中,只有指針和指針總是相同的,因爲只有一個數組packet[10]
  • 無效儘快成爲載體的作爲表示陣列的局部變量超出範圍的元素。這不是你的示例程序的問題,因爲你只有一個函數,但是在一個單獨的函數中讀取它的程序中,這可能會導致未定義的行爲。

爲了解決這個問題,你需要矢量的元素的類型更改爲具有複製功能,例如std::string

1

,因爲你已經定義了一個向量或u_char *和你一遍又一遍推相同的,這意味着你在所有的載體細胞獲得的最後一個值。

1

packets.push_back(packet);時,指針被複製爲vector的元素,而不是指針。這意味着他們都指向相同的地址。這就是爲什麼當你將它們打印成c樣式字符串時你會得到相同的結果。

使用std::string就像std::vector<std::string>會得到您所期望的結果。