포인터 질문입니다.

sj316의 이미지

int main(void)
{
	char *testvar=0;
	
	cout << "testfunc() 호출 시작\n" << endl;
	testfunc(testvar);
	cout << "testfunc() 호출 끝\n" << endl;
	
	cout << "변수내용 출력 시작" << endl;
	printf("testvar 변수주소 : %p\n", testvar);
	printf("testvar 변수내용 : %s\n", testvar);
	cout << "변수내용 출력 끝\n" << endl;

	cout << "메모리 해제 시작" << endl;
	delete[] testvar;
	cout << "메모리 해제 끝" << endl;

	getchar();

	return 0;
}


void testfunc(char *var)
{
	char *tmpvar=0;
	char *pvar=0;

	pvar=(char *)var;

	cout << "testfunc() 시작" << endl;
	tmpvar=new char[sizeof(char) * 30];
	if(!tmpvar)
	{
		cout << "메모리 할당 실패" << endl;
		return;
	}
	memset(tmpvar, 0, 30);
	strcpy(tmpvar, "<<< 테스트 test >>>");

	var=(char *)tmpvar;
	
	printf("var 변수주소 : %p\n", var);
	printf("tmpvar 변수주소 : %p\n", tmpvar);
	printf("pvar 변수주소 : %p\n\n", pvar);

	printf("var 내용 : %s\n", var);
	printf("tmpvar 내용 : %s\n\n", tmpvar);

	cout << "testfunc() 끝" << endl;

}

testfunc()에서 main으로 값을 보내려고 하는데 잘 안 되네요
어떻게 하면 좋을까요?

dotri의 이미지

void func( int *p );

int main( void )
{
    int *t;
    t = (int *)malloc( sizeof( int ) );  /* int 형의 값을 저장할 메모리 공간을 확보 */
    *t = 5;  /* 임의의 값을 대입 */
    printf( "func() 실행 전: %d\n", *t );
    func( t );
    printf( "func() 실행 후: %d\n", *t );
    free( t );  /* 할당된 메모리 공간을 커널에 반환 */
    return 1;
}

void func( int *p )
{
    *p = 10;  /* 인자로 넘어온 포인터가 가르키는 주소의 값을 변경 */
}
익명 사용자의 이미지

sj316 wrote:
testfunc()에서 main으로 값을 보내려고 하는데 잘 안 되네요
어떻게 하면 좋을까요?

포인터가 가리키는 주소값 자체를 바꾸려면 포인터의 포인터를 넘겨주어야 합니다(참조 연산자를 써서). 포인터 자체는 그냥 주소값을 갖는 변수에 불과한지라 testfunc(ptr)한다고 ptr 자체의 값이 바뀌는 건 아니거든요.
sj316의 이미지

main()의 testvar의 주소를 변경하려고 하는데 그게 잘 안 되네요

dotri의 이미지

void func( int **p );

int main( void )
{
  int *t;
  t = (int *)malloc( sizeof( int ) ); /* int 형 값을 저장할 메모리 공간을 확보 */
  *t = 5; /* 임의의 값을 대입 */

  printf( "func() 실행 전: %x, %d\n", t, *t );
  func( &t );
  printf( "func() 실행 후: %x, %d\n", t, *t );

  free( t );
  return 1;
}

void func( int **p )
{
    int *temp;
    temp = (int *)malloc( sizeof(int) );
    *temp = 10;
    free( *p );

    *p = temp;
}
pynoos의 이미지

sj316 wrote:
int main(void)
{
	char *testvar=0;
	
	cout << "testfunc() 호출 시작\n" << endl;
	testfunc(testvar);
	cout << "testfunc() 호출 끝\n" << endl;
	
	cout << "변수내용 출력 시작" << endl;
	printf("testvar 변수주소 : %p\n", testvar);
	printf("testvar 변수내용 : %s\n", testvar);
	cout << "변수내용 출력 끝\n" << endl;

	cout << "메모리 해제 시작" << endl;
	delete[] testvar;
	cout << "메모리 해제 끝" << endl;

	getchar();

	return 0;
}


void testfunc(char *var)
{
	char *tmpvar=0;
	char *pvar=0;

	pvar=(char *)var;

	cout << "testfunc() 시작" << endl;
	tmpvar=new char[sizeof(char) * 30];
	if(!tmpvar)
	{
		cout << "메모리 할당 실패" << endl;
		return;
	}
	memset(tmpvar, 0, 30);
	strcpy(tmpvar, "<<< 테스트 test >>>");

	var=(char *)tmpvar;
	
	printf("var 변수주소 : %p\n", var);
	printf("tmpvar 변수주소 : %p\n", tmpvar);
	printf("pvar 변수주소 : %p\n\n", pvar);

	printf("var 내용 : %s\n", var);
	printf("tmpvar 내용 : %s\n\n", tmpvar);

	cout << "testfunc() 끝" << endl;

}

보아하니 c++을 쓸 거 같은데.. 위 부분의

void testfunc(char *var)

요걸

void testfunc(char * & var)

로 바꿔주세요..

wind772의 이미지

#include <iostream.h>
#include <string.h>

void set(char **xx);

int main(void)
{
        char *tmp = 0;
        set(&tmp);
        cout << tmp;
        delete [] tmp;
        return 0;
}

void set(char **xx)
{
        *xx = new char[30];
        strcpy(*xx, "abcd");
}

함수를 이용해서 포인터의 값을 변경시키려면 이중 포인터를 사용해야 할것 같네요..
만약 그냥 set(tmp); 해버리면 '0'이란 값이 넘어가겠죠??
근데 '&tmp' 하면 포인터 변수 tmp의 주소가 넘어가게 되어 set() 함수에서는 이중포인터 인수(char **xx)를 사용해서 넘어온 포인터 변수의 주소(&tmp)를 받아서 연산을 하면 main() 함수 안에 있는 포인터 변수의 값을 변경시킬 수 있겠죠.^^

===================================================
중요한건 얼마나 아느냐가 아니라 그것에 대한 열정이다.

sj316의 이미지

감사합니다.

댓글 달기

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