less than 1 minute read

EX1

int* add(int* a, int* b)
{
	int c = *a + *b;
	return &c;
}

int main()
{
	int a = 4;
	int b = 2;
	int* ptr = add(&a, &b);
	printf("%d", *ptr);
}

포인터를 리턴할때는 함수앞에 *를 붙이고 주소를 리턴합니다.

EX2

#include <stdio.h>
#include <stdlib.h>
void print()
{
	printf("hello\n");
}
int* add(int* a, int* b)
{
	int c = *a + *b;
	return &c;
}

int main()
{
	int a = 4;
	int b = 2;
	int* ptr = add(&a, &b);
	print();
	printf("%d", *ptr);
}

실행결과

hello
32758

ptr값이 제대로 출력되지 않았습니다.
이유를 알아보겠습니다. shot2
다음과 같은 형태로 스택이 만들어 집니다.
스택에서 130~160까지 add함수가 사용한다고 가정해봅시다.
add함수가 끝나면 130~160까지의 공간은 할당 해제가 됩니다.
c의 메모리 블럭은 남아있지만 그것은 보장되지 않습니다.
그리고 print()함수를 사용하면 다음과 같은 형태로 변합니다.
shot2
기존 add함수가 사용한 공간은 보장되지 않았기에 그곳을 print함수가 덮어서 이런일이 발생한 것입니다.
그렇다면 동적할당을 하여서 해결할 수 있습니다.

#include <stdio.h>
#include <stdlib.h>
void print()
{
	printf("hello\n");
}
int* add(int* a, int* b)
{
	printf("%d, %d\n", &a, a);
	int *c = (int*)malloc(sizeof(int));
	*c = *a + *b;
	return &c;
}

int main()
{
	int a = 4;
	int b = 2;
	int* ptr = add(&a, &b);
	printf("%d\n", &a);
	print();
	printf("%d", *ptr);
}

Leave a comment