프로그래밍 초보가 질문하는 스택과 힙

jinkelly의 이미지

운영체제를 공부하면서 프로세스 내 메모리 구조를 보니
메모리 주소가 stack은 high에서 low로 heap은 low에서 high로 각각 감소나 증가하는 것으로 이해하였습니다.
그러나 실제로 이것을 실험?하고자 간단하게 프로그래밍 해보앗으나 둘다 증가하였습니다.
제가 무엇을 잘못 이해 하였는지 잘 모르겠습니다.
사진을 참고하여 주시기 바랍니다^^
========================================================================

#include <stdio.h>
#include <stdlib.h>
#define N 10
 
int main()
{
	int stack_num[N]={0};
	int* heap_num=(int*)malloc(sizeof(int)*N);
 
	int i=0;
	printf("스택 : ");
	for(i=0; i<N; i++)
	{
		printf("%p\t", &stack_num[i]);
	}
		//주소값이 점점 감소
 
	printf("\n");
	printf("힙 : ");
	for(i=0; i<N; i++)
	{
		printf("%p\t", (heap_num+i));
	}
		//주소값이 점점 증가
 
	return 0;
 
}

========================================================================
File attachments: 
첨부파일 크기
Image icon dd.jpg107.12 KB
dbdan의 이미지

(&heap_num < stack_num)은 true일것입니다.

익명 사용자의 이미지

네 위 첨부된 dd.jpg사진을 보시면 스택이 힙보다 주소가 높긴한데 왜 스택영역에 채워질 배열의 주소가 증가되는줄 모르겠습니다 별거 아니지만 ...운영체제를 공부하다 보니 ..그냥 궁금합니다^^

unipro의 이미지

스택의 증가와 힙의 증가의 방향이 그렇다는 것입니다.
메모리의 인덱싱의 방향은 변하지 않습니다.
단순히 질문하신 원글에서 보면 메모리의 주소를 가르키는 low, high라는 의미가 힙과 스택에서 바뀌지 않았잖아요.

내 블로그: http://unipro.tistory.com

익명 사용자의 이미지

스택이 high에서 low로 자란다는 건... 지역 변수 배열 하나를 선언했을때 그 배열의 0번 원소의 주소가 더 높고 1번 원소의 주소가 더 낮다는 뜻은 아니거든요. 원소 10개짜리 배열이면 그 크기만큼의 덩어리를 스택에 할당하고 0번 원소는 그 중 제일 낮은 주소에 할당됩니다. (뭐 안 그런 아키텍처도 있을런지는 모르겠습니다만)

힙도 마찬가지로, 이 경우 공교롭게도 증가하는 걸로 나왔습니다만 heap_num+i 에서 +대신에 -를 쓰면 점점 줄어드는 값을 보셨을 겁니다.

#include <stdio.h>
#include <stdlib.h>
#define N 10
 
int main()
{
    int s1;
    int s2;
    int s3;
    int s4;
 
    int* h1 =(int*)malloc(sizeof(int));
    int* h2 =(int*)malloc(sizeof(int));
    int* h3 =(int*)malloc(sizeof(int));
    int* h4 =(int*)malloc(sizeof(int));
 
    printf("stack :\n");
    printf("s1 = %p\n", &s1);
    printf("s2 = %p\n", &s2);
    printf("s3 = %p\n", &s3);
    printf("s4 = %p\n", &s4);
 
    printf("\n");
    printf("heap :\n");
    printf("h1 = %p\n", h1);
    printf("h2 = %p\n", h2);
    printf("h3 = %p\n", h3);
    printf("h4 = %p\n", h4);
 
    return 0;
 
}

./a.out
stack :
s1 = 0xbfcd1650
s2 = 0xbfcd164c
s3 = 0xbfcd1648
s4 = 0xbfcd1644
 
heap :
h1 = 0x81cf008
h2 = 0x81cf018
h3 = 0x81cf028
h4 = 0x81cf038

익명 사용자의 이미지

바로 위 리플에 적는 걸 깜박했는데 (로그인을 안 했더만 수정이 안 되네요)

스택이 아래로 자란다는 걸 확인하려면 저렇게 한 함수 내에서 선언한 지역 변수들의 주소값을 보고 판단하는 것도 사실 충분치 못하지 싶고...

제일 정확한 건 함수를 연쇄적으로 호출해보시는 게 낫겠습니다.

a() -> b() -> c()

순으로 호출할 때 세 함수의 로컬 변수의 주소가 어떻게 되는지 말이죠.

댓글 달기

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