함수내에서 더블포인터를 인자로 주었을시에...알수없는 오류

jongyoungcha의 이미지

#include
#include

void memory(int num, int **pp){
pp = (int*)malloc(sizeof(int)*4);
*pp[0] = 1;
*pp[1] = 2;
*pp[2] = 3;
}

int main(){
int num = 8;
int* p = NULL;
memory(num, p);

return 0;
}

이부분에서 더블포인터를 사용해서 하면 오류가 납니다.

그러나 함수내에서 인자값에 더블 포인터가 아니라 그냥 포인터를 올리면 에러가 나지 않는데요

이것이 왜 그런것 인가요.... 부탁드려용 ㅠ

jongyoungcha의 이미지

여기서 더블 포인터를 써서 동적할당을 할 때 까지는 에러가 나지 않지만

저 포인터 값에 정수 값을 넣어주면 그대로 에러가 나게 됩니다. 왜그런지 알 수 있을까요? ㅠㅠ

qiiiiiiiip의 이미지

&p, *pp 겠죠.

컴파일러 메시지만 잘 읽어도 대부분 문제는 풀릴텐데.....

jongyoungcha의 이미지

아 죄송합니다 저기 memory 함수 호출 부분은 memory(num, &p);입니다. 죄송합니다. 하지만 제가 질문 드리고 싶은 부분은 저게 아니라

저기 함수에 인자인 **pp는 포인터 포인터 변수를 가리키는 변수입니다. 따라서 인자에 값을 대입하면 **pp = &p 이므로

결국 *pp의 값은 main에 선언한 *p가 가르키는 변수의 주소값을 가르키는 결로 알고있습니다 따라서

int *p;
p = (int*)malloc(sizeof(int));

이거나

int *p;
int **pp = &p;
*pp = (int*)malloc(sizeof(int));

이거나 같은 연산이 아닌가 싶은데

코드를 돌려보면 알 수 없는 에러라고 하면서 종료가 됩니다. 이부분이 전 정말 이해가 되지 않아서요 ㅠ

qiiiiiiiip의 이미지

*p = malloc
p[0] = 1

에 대응되는 코드는

**p = malloc
(*p)[0] = 1;

이겠지요..
jongyoungcha의 이미지

실질적으로 함수내에서 malloc할당을 할때는 문제가 생기지 않습니다만은

함수내에서 할당된 값에 정수를 대입할때는 에러가 납니다. ㅠ

shint의 이미지

포인터를 함수인자값에서 참조하기 위해서는. &를 사용해야 하는데. 그걸 잘 못해서. 외부에서 malloc 해줬습니다.
함수 내부에서 malloc 하고 싶다면. return 값으로 주어도 되어 보입니다.
아니면. 그냥 & 인자가 되는 포인터 하나만 별도로 주어도 될것 같습니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>	//strlen memset
 
void fn_ref(int num, int **p)
{
	int size = sizeof(int);
	int n = 0;
 
//	p 주소
//	*p 값
//	**p 값의 주소
 
	printf("fn_ref()---------\n");
	printf("p   주소 : %x\n", p);
	printf("&*p 주소 : %x\n", &*p);
 
	printf("*p  주소 : %x\n", *p);
	printf("&p  주소 : %x\n", &p);
//	printf("%x\n", **p);	//죽는다.
 
 
	n = 1;
	memcpy(&p[0], &n, size);
//	*(p+0) = (int*)n;
//	*(&p[0]) = (int*)n;
 
	n = 2;
//	memcpy(&p[1], &n, size);
	*(p+1) = (int*)n;
//	*(&p[1]) = (int*)n;
 
	n = 3;
//	memcpy(&p[2], &n, size);
//	*(p+2) = (int*)n;
	*(&p[2]) = (int*)n;
 
	printf("%d %d\n", *(&p[0]), *(p+0));
	printf("%d %d\n", *(&p[1]), *(p+1));
	printf("%d %d\n", *(&p[2]), *(p+2));
}
 
 
int** fn_noref(int num, int **p, int& t)
{
	int size = sizeof(int);
	p = (int**)malloc(size*4);
	memset(p, '\0', size*4);
	int n = 0;
 
//	p 주소
//	*p 값
//	**p 값의 주소
 
	printf("fn_noref()---------\n");
	printf("p   주소 : %x\n", p);
	printf("&*p 주소 : %x\n", &*p);
 
	printf("*p  주소 : %x\n", *p);
	printf("&p  주소 : %x\n", &p);
//	printf("%x\n", **p);	//죽는다.
 
 
	n = 4;
	memcpy(&p[0], &n, size);
//	*(p+0) = (int*)n;
//	*(&p[0]) = (int*)n;
 
	n = 5;
//	memcpy(&p[1], &n, size);
	*(p+1) = (int*)n;
//	*(&p[1]) = (int*)n;
 
	n = 6;
//	memcpy(&p[2], &n, size);
//	*(p+2) = (int*)n;
	*(&p[2]) = (int*)n;
 
	printf("%d %d\n", *(&p[0]), *(p+0));
	printf("%d %d\n", *(&p[1]), *(p+1));
	printf("%d %d\n", *(&p[2]), *(p+2));
 
	t = (int)p;
	return p;
}
 
 
int main()
{
	int num = 8;
	int** p = NULL;
 
	//
	int size = sizeof(int);
	p = (int**)malloc(size*4);
	memset(p, '\0', size*4);
	fn_ref(num, p);
 
	printf("\n");
	printf("main----------\n");
 
	printf("p   주소 : %x\n", p);
	printf("&*p 주소 : %x\n", &*p);
 
	printf("*p  주소 : %x\n", *p);
	printf("&p  주소 : %x\n", &p);
 
	//
	printf("%d %d\n", *(&p[0]), *(p+0));
	printf("%d %d\n", *(&p[1]), *(p+1));
	printf("%d %d\n", *(&p[2]), *(p+2));
	printf("\n");
 
 
	free(p);
	p = NULL;
 
 
 
	//
	int t;
	p = fn_noref(num, p, t);
 
	p = (int**)t;
 
	printf("\n");
	printf("main----------\n");
 
	printf("p   주소 : %x\n", p);
	printf("&*p 주소 : %x\n", &*p);
 
	printf("*p  주소 : %x\n", *p);
	printf("&p  주소 : %x\n", &p);
 
	//
	printf("%d %d\n", *(&p[0]), *(p+0));
	printf("%d %d\n", *(&p[1]), *(p+1));
	printf("%d %d\n", *(&p[2]), *(p+2));
	printf("\n");
 
 
	free(p);
	p = NULL;
	return 0;
}
 
 
//출력 결과
//
//fn_ref()---------
//p   주소 : 373930
//&*p 주소 : 373930
//*p  주소 : 0
//&p  주소 : 12ff24
//1 1
//2 2
//3 3
//
//main----------
//p   주소 : 373930
//&*p 주소 : 373930
//*p  주소 : 1
//&p  주소 : 12ff78
//1 1
//2 2
//3 3
//
//fn_noref()---------
//p   주소 : 373930
//&*p 주소 : 373930
//*p  주소 : 0
//&p  주소 : 12ff24
//4 4
//5 5
//6 6
//
//main----------
//p   주소 : 373930
//&*p 주소 : 373930
//*p  주소 : 4
//&p  주소 : 12ff78
//4 4
//5 5
//6 6

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

익명 사용자의 이미지

답변주신분들 넘넘 감사합니다 감사합니다. ㅠ

#include
#include

void memory(int num, int **pp) {
*pp = (int*) malloc(sizeof(int) * 4);//제가 급하게 올리다 보니 더블포인터 변수인 pp에 * 를넣지 않앗습니다. ㅠ
(*pp)[0] = 1;//qiiiiiip님 말씀대로 괄호를 여기다 주니까 되네요
(*pp)[1] = 2;
(*pp)[2] = 3;
}

int main() {
int num = 8;
int* p = NULL;
memory(num, &p);

printf("%d\n", p[0]);
printf("%d\n", p[1]);
printf("%d\n", p[2]);

return 0;
}

감사합니다.

jongyoungcha의 이미지

답변주신분들 감사합니다.

문제를 찾았는데요 ㅠ 제가 급하게 올리느라 문제가 잘못올려졌네요

#include
#include

void memory(int num, int **pp) {
*pp = (int*) malloc(sizeof(int) * 4);//이부분에서 제가 *를 빼먹엇어서 pp앞에 *값을 넣었습니다.
(*pp)[0] = 1;//qiiiiiiiiiip님 말씀대로 더블 포인터 쪽에 괄호로 감싸니까 컴파일 에러가 없어졌습니다. 컴파일러의 수직 우선순서가 문제였나보내요 ㅠ
(*pp)[1] = 2;
(*pp)[2] = 3;
}

int main() {
int num = 8;
int* p = NULL;
memory(num, &p);

printf("%d\n", p[0]);
printf("%d\n", p[1]);
printf("%d\n", p[2]);

return 0;
}

댓글 달기

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