2014-10-11 66 views
0

我有下面的代碼,當我打印時,我已經推入向量中的元素不同。向量不顯示正確的元素

#include<stdio.h> 
#include<iostream> 
#include<vector> 

using namespace std; 
int size = 0; 
int main() 
{ 
    int i,num1,num2,num; 
    vector<char *>vec; 
    for(i=0;i<7;i++) 
    { 
     char buffer[30]; 
     if(i%2==0) 
     { 
      strcpy(buffer,"hello"); 
     } 
     else 
     { 
      strcpy(buffer,"bye"); 
     } 
     printf("buffer has %s\n",buffer); 
     vec.push_back(buffer); 
    } 

    for(i=0;i<vec.size();i++) 
    { 
     cout<<"CHECK vec["<<i<<"] has "<<vec[i]<<endl; 

    } 
    return 0; 
} 

當我執行我得到了以下結果:

buffer has hello 
buffer has bye 
buffer has hello 
buffer has bye 
buffer has hello 
buffer has bye 
buffer has hello 
CHECK vec[0] has hello 
CHECK vec[1] has hello 
CHECK vec[2] has hello 
CHECK vec[3] has hello 
CHECK vec[4] has hello 
CHECK vec[5] has hello 
CHECK vec[6] has hello 

我可以看到通過GDB如下:

(gdb) p vec 
$5 = std::vector of length 1, capacity 1 = {**0x7fffffffe790** "bye"} 
(gdb) n 
11  for(i=0;i<7;i++) 
(gdb) p vec 
$6 = std::vector of length 2, capacity 2 = {**0x7fffffffe790** "bye", **0x7fffffffe790** "bye"} 

矢量元素的地址是不是第一次不同和其他元素的第二元素等。任何人都可以請解釋如何在向量中獲得正確的元素以及爲什麼發生這種情況。

+1

首先,正確縮進你的代碼。 – Ilya 2014-10-11 11:29:14

+1

您的矢量不包含字符串的存儲空間,只包含指向局部變量的指針。當它超出範圍時,向量指向垃圾。改爲使用std :: string的向量。 – 2014-10-11 11:30:36

+1

+1,因爲你使用'gdb'-1,因爲縮進很差,代碼也比較大 – P0W 2014-10-11 11:30:50

回答

1

問題是你沒有在vector中插入一個字符串,而是一個指針。一個指針將地址保存到內存的一部分,在你的情況下是緩衝區,正如你在調試時看到的那樣,這個指針具有相同的值。所以實際上你是打印緩衝區,而不是從你的矢量單獨的字符串。

我的建議是使用STL的全部功能,並使用提供的字符串,它將按照您的預期工作。

另請注意,緩衝區數組/字符串在for循環的每次迭代結束時都會釋放,因此您輸入未定義的行爲區域。

0

您只是存儲始終具有相同內存位置的緩衝區變量的地址。由於i = 6是最後一個循環,因此緩衝區的值爲「hello」,當您嘗試打印矢量時,它將打印該值。

編輯:當您打印矢量時,緩衝區已超出範圍,它可能會打印任何內容,因此未定義的行爲。

+0

差不多。在實踐中可能是真的。但不可靠的是:到最後一個循環運行時緩衝區並不存在,所以實際上你可以獲得任何東西。 – 2014-10-11 12:13:18

1

使用字符串的向量。但是,如果你真的想使用char *向量,這將做到:

#include <stdio.h> 
#include <iostream> 
#include <vector> 
#include <cstring> 

using namespace std; 

int size = 0; 
int main() 
{ 
    int i,num1,num2,num; 
    vector<char *>vec; 

    for(i=0;i<7;i++) 
    { 
     char *buffer = new char[30]; 
     if(i%2==0) 
     { 
      strcpy(buffer,"hello"); 
     } 
     else 
     { 
      strcpy(buffer,"bye"); 
     } 

     printf("buffer has %s\n",buffer); 
     vec.push_back(buffer); 
    } 

    for(i=0;i<vec.size();i++) 
    { 
     char *buffer = vec[i]; 
     cout<<"CHECK vec["<<i<<"] has "<<buffer<<endl; 
     delete [] buffer; 
    } 

    vec.clear(); 

    return 0; 
}