전역 포인터 변수의 값 변화 현상..

NeoCode24의 이미지

테스트용 소스 입니다.

2차원 포인터는 원래 함수에 넘겨서 malloc()를 일정 FACTOR만큼 꾸준히 증가하는 부분입니다.

임시로 땜방용으로 만든거라.. 괜히 2차원 포인터를 사용한것
같지만.. 우선 밑에 결과에 의아심을 함 보아주세요.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>


#define SUCCESS 0
#define ERROR -1
#define IPADDRESS_LEN 50
#define IFNAME_LEN 50
#define INTERFACE_MAX_COUNT 100
#define GROUP_MAX_COUNT 3

typedef struct ForwardingTreeIfOutInfo
{
	char szOutIfName[IFNAME_LEN];
	int nOutIfIndex;
} ForwardingTreeIfOutInfo_t;

typedef struct ForwardingTreeGroupOutInfo
{
    char szGroupAddress[IPADDRESS_LEN];
    char szSourceAddress[IPADDRESS_LEN];
    char szSourceMaskAddress[IPADDRESS_LEN];
    char szUpstreamNeighbor[IPADDRESS_LEN];
    char szRPAddress[IPADDRESS_LEN];
    char szInIfName[IFNAME_LEN];
    int nInIfIndex;
    int nOutIfCnt;
    ForwardingTreeIfOutInfo_t stOutIf[INTERFACE_MAX_COUNT];
} ForwardingTreeGroupOutInfo_t;


ForwardingTreeGroupOutInfo_t *g_pstGroupStructArray;


int main (int argc, char *argv[])
{
	ForwardingTreeGroupOutInfo_t stForwardingTreeGroupOutInfo[GROUP_MAX_COUNT];

	ForwardingTreeGroupOutInfo_t **pstForwardingTreeGroupOutInfo, *ptrTemp;

	g_pstGroupStructArray = stForwardingTreeGroupOutInfo;
	pstForwardingTreeGroupOutInfo = &g_pstGroupStructArray;

	ptrTemp = (ForwardingTreeGroupOutInfo_t *)malloc(sizeof(ForwardingTreeGroupOutInfo_t) * GROUP_MAX_COUNT * 2);

	*pstForwardingTreeGroupOutInfo = ptrTemp;


	return SUCCESS;
}

함수 의 리턴 앞줄에
" *pstForwardingTreeGroupOutInfo = ptrTemp; "

보면 전역변수는 절대 손대지 않았습니다.

새로 malloc()한 ptrTemp만 2차원포인터의 값으로 넣었습니다.

그렇게 되면 전역변수는 바뀌지 말아야 하는데..

이상하게 전역변수 조차도 바껴집니다..

제가 포인터를 잘못사용하고 있는건지..

전역포인터 변수에 값을 넣을때 주의 해야 할점이 있는건지..

충고좀 부탁드립니다.

소스의 목적은..

배열을 사용하다가 그 크기를 초과하게 되면 일정 배율로 동적할당하는 방법입니다.

때문에 후에 사용되는 변수가 동적 할당 된놈인지.. 배열인지 알수가 없기에 전역변수에 배열의 주소를 저장 시켜뒀습니다.

free() 함수를 사용할때 if문으로

if ( 배열의 주소 != *(2차원 포인터) )
이렇게 하여 다르다면 malloc() 했다고 판단하였기 때문입니다.

그런데 원하지 않게 배열의 주소가 담겨 있는 전역변수의 값도

같이 바껴 버립니다.. ㅡㅡ;;

고수님들의 날카로운 지적 부탁드립니다~

Fe.head의 이미지

// ForwardingTreeGroupOutInfo_t == int 라고 가정
// stForwardingTreeGroupOutInfo == arr_i 라고 가정
// pstForwardingTreeGroupOutInf == ppi 로 가정
// ptrTemp == pi 로 가정 

int * g_pi;

int main (int argc, char *argv[])
{
   int arr_i[GROUP_MAX_COUNT];
   int ** ppi;
   int * pi;

   g_pi = arr_i;

   ppi = &g_pi;

   pi= (int *)malloc(sizeof(int) * GROUP_MAX_COUNT * 2);

 /*  *ppi = pi;  *ppi == g_i 임.
      즉 g_i = pi 가 됨
 */
   ppi = &pi; // 이게 맞지 않을까요?


   return SUCCESS;
}

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

doldori의 이미지

전역 포인터가 바뀌는 이유는 fehead님이 설명해 주셨고요, 다른 문제도 있습니다.
배열로 만든 것보다 더 많은 메모리가 필요해지면 malloc()을 한다고 하셨는데
그럼 malloc() 후에 배열의 메모리는 쓸모없이 낭비됩니다. 처음부터 malloc()을
하는 것이 좋아 보입니다. 참고하세요.
http://bbs.kldp.org/viewtopic.php?p=275794&highlight=#275794

ㅡ,.ㅡ;;의 이미지

변수명이 너무김..ㅡ,.ㅡ;;


----------------------------------------------------------------------------

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.