2
mingw 컴파일러를 사용하여 Windows에서 CodeBlocks의 다음 C++ 코드를 실행할 때 모두 정상입니다. Xcode에서 포인터를 전달하는 중 오류가 발생하지만 Windows의 Codeblock에서 작동합니다.
1
1
그러나 Mac에서
, 나는 를 얻을 수있다void func (vector<int> &v1, vector<vector< int *> > &v2);
int main()
{
vector<int> v1;
v1.push_back(0);
vector<vector <int *> > v2;
vector<int *> vTemp;
int x = 0;
int * ptr = &x;
vTemp.push_back(ptr);
v2.push_back(vTemp);
func(v1,v2);
cout<<*(v2[0][1])<<endl;
return 0;
}
void func (vector<int> &v1, vector<vector< int *> > &v2)
{
v1.push_back(1);
int *ptr = &(v1[1]);
v2[0].push_back(ptr);
cout<<*(v2[0][1])<<endl;
v1.push_back(2);
int *ptr2 = &(v1[2]);
v2[0].push_back(ptr2);
v1.push_back(3);
int *ptr3 = &(v1[3]);
v2[0].push_back(ptr3);
}
내가 기대하는 출력을 (그리고 Windows에서 얻을 수) : 그러나, 나는 맥 OS X에서 실행하면 작동하지 않습니다
1
0
왜 이런 일이 일어나는 지 아는 사람이 있습니까?
이 프로그램을 확장하려면'int * ptr = & (v1 [1])'을 실행하고'v1.push_back (2)'를 실행하면됩니다. 'push_back'은 벡터의 용량을 증가시킬 필요가있는 경우 벡터 요소를 가리키는 모든 포인터를 무효화 할 수 있습니다. 'v1'을 생성 한 후에'main'에'v1.reserve (4);'행을 추가하면 용량이 충분 해지며 예상 답변을 얻을 수 있습니다. 물론 너무 약해서 이런 식으로 포인터를 저장하는 것은 여전히 나쁜 생각입니다. – bames53
@ bames53 +1 좋은 확장 – justin
답장을 보내 주셔서 감사합니다. 정의되지 않은 동작이 있어야한다고 생각했지만 어디에서 왔는지 알 수 없었습니다. 그래서 벡터의 객체에 대한 포인터는 나쁜 생각입니다. 맞습니까? – Edlennion