#include <stdio.h>
#include <stdlib.h>
int main()
{
char* p = "abcddddddddddddddddd"; //p为一个char指针,在stack区,"abc"在常量区,
char* c1 = NULL; //c1在bss
c1 = (char*)malloc(20*sizeof(char)); //给c1分配了20个char大小的空间
strcpy(c1,"hehehe"); //先在常量区分配一个"hehehe",然后拷贝到heap区
char c2[] = "eeeeeeeee11111"; //c2存放在stacK,因为其由系统分配
/*修改测试:
//c1是自己分配的,在heap区,可以修改
//c2由系统分配,在stack区,可以修改
//p指向的是常量区,不能修改
c2[5] = 'c'; //ok
c1[5] = 'c'; //ok
p[5] = 'c'; //error
*/
printf("%X %X %s\n", &p, &("abcddddddddddddddddd"), p);
printf("%X %X %s\n", &c1, c1, c1);
printf("%X %X %s\n", &c2, c2, c2);
printf("%X %X %s\n", &c2[5], c2[5], c2);
/*
p,c1,c2都在stack, "abcddddddddddddddddd"在常量区,c1存放的内容在heap区
432CE28 D37888B4 abcddddddddddddddddd
432CE30 D5693010 hehehe
432CE39 432CE39 eeeeeeeee11111
*/
return c1;
}
运行结果:
ubuntu:
windows VS:
可以看出,ubuntu下面,栈的扩展方向从低地址到高地址,数组也是。
而window下,栈的扩展方向从高地址到低地址,数组从【0】到【n】是从低地址到高地址。
应该与编译器也有关系,详细的以后再检验吧。