포인터의 값이 변경되는 상황
C와 C++을 섞어쓰고 있는 초보입니다.
프로그램을 만드는 도중 오류가 발생하였는데,
구조체 내부에서 선언되어있는 변수가 한번 정해진 후 변경시키는 코드가 전혀 없었는데,
어느순간 정상적인 값(0~9999) 을 벗어난 이상한 값(예를 들면 -597859448)을 찍는 것을 발견했습니다.
이에 대해 아무런 아이디어가 없어서 여러분들의 도움을 받고자 합니다.
먼저 만든 구조체의 일부분입니다.
typedef struct { int target; } LINK; typedef struct { int degree; int seed; int activation; vector<LINK> link; } NODE;
다음은 메인 함수의 일부분입니다.
위의 구조체에서 link와 관련 있는 부분은 ensembleNum1에서만 변경됩니다.
좀 더 자세히 말하면 모든 구조체들은 아래의 반복문들보다 앞서서 메모리가 할당되었고,
link는 InitializeNetworks 함수에서 매번 link.clear()를 이용하여 값을 지운 후 MakeNetwork부분에서 다시 값을 할당받으며 그 이후에선 변경이 없습니다.
다만 오류를 확인하기 위해 PrintNetwork라는 함수를 만들어 그 함수에서 link의 값을 txt파일로 전부 출력하는 것이 고작입니다.
그 이후의 부분은 node의 activation과 seed라는 변수만을 변경하며 link는 전혀 사용되지 않습니다.
for(int ensembleNum1 = 0; ensembleNum1 < c->totalEnsembles; ensembleNum1 ++) { InitializeNetworks(m, zp, zn); for(int layerNum = 0; layerNum < m->totalLayers; layerNum ++) MakeNetworks(m, layerNum); PrintNetworks(m); PlantSeeds(m); for(int ensembleNum2 = 0; ensembleNum2 < c->totalEnsembles; ensembleNum2 ++) { ////// Execute Dynamic Simulation and Print It ////// cout << "EnsembleNum : "<< ensembleNum2<< endl; InitializeDynamics(m); ConductExperiment(m); PrintExperiment(c, m, ensembleNum1, ensembleNum2); } } Free(c, m);
그러다가 link가 사용되는 부분은 ConductExperiment의 안에서 불러 쓰는 Activate이라는 함수인데,
이 함수에서는 아래와 같이 link에 관한 함수를 사용하기는 하지만 변경하지는 않습니다.
int Activate(MULTIPLEX *&m, double threshold, int nodeNum) { if (m->gr[0].node[nodeNum].seed == 1) return 0; for(int linkNum = 0; linkNum < m->gr[1].node[nodeNum].link.size(); linkNum ++) { int enemy = m->gr[1].node[nodeNum].link.at(linkNum).target; if (enemy > m->totalNodes) cout << nodeNum<< ",en"<< '\t'<< linkNum<< '\t'<< m->gr[1].node[nodeNum].link.size()<< '\t'<< enemy<< endl; if (m->gr[1].node[enemy].activation == 1) { return 0; } } int activatedNeighbours = 0; for(int linkNum = 0; linkNum < m->gr[0].node[nodeNum].link.size(); linkNum ++) { int neighbour = m->gr[0].node[nodeNum].link.at(linkNum).target; if (neighbour > m->totalNodes) cout << nodeNum<< ",ne"<< '\t'<< linkNum<< '\t'<< m->gr[0].node[nodeNum].link.size()<< '\t'<< neighbour<< '\t'<< &(m->gr[0].node[neighbour])<< endl; if (m->gr[0].node[neighbour].activation == 1) activatedNeighbours ++; } double ratioActivated = static_cast<double>(activatedNeighbours) / static_cast<double>(m->gr[0].node[nodeNum].degree); if (ratioActivated > threshold) return 1; else return 0; }
에러가 뜨는 부분을 추적해보니 앞의 main함수에서 ensembleNum1에 관한 for문이 두번째 쯤 반복될 때에
activate함수의 두번째 for문에서 linkNum = 0일때 neighbour의 값이 -597859448와 같이 전혀 엉뚱한 값이 되는 것을 발견했습니다.
하지만 PrintNetwork라는 함수에서 각 노드마다 노드의 link의 target을 출력할 때에는 neighbour값과는 다르게 정상적인 값으로 출력됩니다.
PrintNetwork이후로 target이라는 양이 쓰이는 것은 Activate함수가 처음인데 어떻게 이것이 가능할까요?
댓글 달기