2014-10-11 2 views
0

인쇄 할 때 벡터에 밀어 넣은 요소가 동일하지 않은 아래 코드가 있습니다. 벡터 요소의벡터가 오른쪽 요소를 표시하지 않습니다.

(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 회에 차이가 있습니다

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를를 통해 다음 볼 수 있습니다 : 나는 실행되면

#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; 
} 

나는 다음과 같은 결과를 얻었다 두 번째 요소와 기타 요소에 대해서도 마찬가지입니다. 누구든지 벡터의 올바른 요소를 얻는 방법과 왜 이런 일이 일어 났는지 설명해 주실 수 있습니까?

+1

우선, 들여 쓰기 코드를 올바르게 작성하십시오. – Ilya

+1

벡터에 문자열에 대한 저장소가 없으며 로컬 변수에 대한 포인터 만 있습니다. 범위를 벗어나면 벡터는 쓰레기를 가리 킵니다. 대신 std :: string의 벡터를 사용하십시오. –

+1

들여 쓰기가 좋지 않고 코드가 비교적 크기 때문에 'gdb'-1을 사용했기 때문에 +1합니다. – P0W

답변

1

문제는 벡터에 문자열이 아니라 포인터를 넣는 것이 아니라는 것입니다. 포인터는 메모리의 일부분에 대한 주소를 담고 있으며, 여러분의 경우 버퍼와 디버깅 할 때 보았 듯이, 그 포인터는 같은 값을 갖는다. 그래서 실제로 벡터와는 별도의 문자열이 아니라 버퍼를 인쇄하고 있습니다.

내 권장 사항은 STL의 모든 기능을 사용하고 예상대로 작동하는 제공된 문자열을 사용하는 것입니다.

또한 버퍼 배열/문자열은 for 루프의 각 반복 끝에 할당 취소되므로 정의되지 않은 동작 영역을 입력하게됩니다.

0

항상 동일한 메모리 위치를 갖는 버퍼 변수의 주소를 저장하는 것입니다. i = 6이 마지막 루프이기 때문에 버퍼에는 "hello"라는 값이 있으며 벡터를 인쇄하려고하면 그 값을 인쇄합니다.

편집 : 벡터를 인쇄하는 동안 버퍼가 범위를 벗어나서 정의되지 않은 동작을 인쇄 할 수 있습니다.

+0

거의. 아마도 실제로는 사실입니다. 그러나 신뢰할 수 없습니다 : 최종 루프가 실행될 때까지 버퍼가 존재하지 않습니다. 따라서 실제로 아무 것도 얻을 수 없습니다. –

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; 
} 
관련 문제