gcc(Ubuntu / Linaro 4.6.3-1ubuntu5)4.6.3およびIntel(R)Core(TM)2 Duo CPUで次のプログラムを実行し、cプログラムスタックが下向きに成長することを確認したいので、次のコードを記述します。
#include <stdio.h>
#include <malloc.h>
#include <string.h>
static int a = 1;
static int b;
int c = 2;
int d;
void foo(void)
{
int *p1;
int *p2;
int *p3;
int *p4;
printf("&p1\t%p\n", &p1);
printf("&p2\t%p\n", &p2);
printf("&p3\t%p\n", &p3);
printf("&p4\t%p\n", &p4);
}
int main()
{
static int e = 3;
static int f;
int g = 4;
int h;
char *str1 = "abc";
char *str2 = "abc";
char *str3;
char *str4;
printf("&\"abc\"\t%p\n", &"abc");
printf("&str1\t%p\n", &str1);
printf("&str2\t%p\n", &str2);
printf("str1\t%p\n", str1);
printf("str2\t%p\n", str2);
printf("&str3\t%p\n", &str3);
printf("str3\t%p\n", str3);
str4 = (char *)malloc(strlen("abc")*sizeof(char));
printf("&str4\t%p\n", &str4);
printf("str4\t%p\n", str4);
printf("&g\t%p\n", &g);
printf("&h\t%p\n", &h);
foo();
return 0;
}
私はこの結果を得る:
&"abc" 0x8048680
&str1 0xbff1be20
&str2 0xbff1be24
str1 0x8048680
str2 0x8048680
&str3 0xbff1be28
str3 0x8048599
&str4 0xbff1be2c
str4 0x950f008
&g 0xbff1be18
&h 0xbff1be1c
&p1 0xbff1bde0
&p2 0xbff1bde4
&p3 0xbff1bde8
&p4 0xbff1bdec
str1、str2、str3、str4のアドレスが上向きに成長し、p1、p2、p3、p4のアドレスも下向きではなく上向きに成長するのはなぜですか?