포인터의 값이 변경되는 상황

y9150의 이미지

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함수가 처음인데 어떻게 이것이 가능할까요?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.