程序由指令和数据组成。
c语言中内存分为5个区,由高地址到低地址分别为栈、堆、全局区(静态区)、常量区和代码区。
栈区(stack):存放函数局部变量,函数的参数值和返回值,由系统自动管理。
堆区(heap):由malloc函数分配内存再由free释放内存。
全局区(静态区):存放全局变量和静态变量(static),初始化的全局变量和静态变量存放在(.data),没有初始化的全局变量和没有初始化的静态变量存放在(.bss)区。
常量区:字符串常量"hello world"(当一个字符串常量用来为数组初始化的时候,给字符串不会放在常量区,而是放在对应的数组中)和被const修饰的全局变量
存放在(.rodata段)。
代码区:存放函数的二进制代码(text)。如果某一段内存分配为代码区,那这块区域可读不可写。
生长方向:栈由高地址向低地址方向生长,堆由低地址向高地址方向生长。
int main(){ char a[]="hello world"; printf(" the a address is 0x%p,%s",a,a); a[3]='a'; printf(" the a address is 0x%p,%s",a,a); return 0; }
数组 "hello world"存于栈中,所以它的值可以修改。
int main(){ char *a="hello world"; printf(" the a address is 0x%p,%s",a,a); a[3]='a'; printf(" the a address is 0x%p,%s",a,a); return 0; }
"hello world"存于常量区,指针a存于栈中。a指向"hello world"的首地址,由于“hello world"为常量所以不能被修改。
char c[]="hello world"; int main(){ printf(" the c address is 0x%p,%s",c,c); c[3]='a'; printf(" the c address is 0x%p,%s",c,c); return 0; }
数组c存放于全局区(静态区),所以数组的值可以被修改。
char *c="hello world"; int main(){ printf(" the c address is 0x%p,%s",c,c); c[3]='a'; printf(" the c address is 0x%p,%s",c,c); return 0; }
"hello world"存在于常量区,而指针c存在于全局区(静态区):常量不可以被修改。
int main(){ char a[]="hello world"; char c[]="hello world"; char *p ="hello world"; char *d ="hello world"; printf(" the a address is 0x%p,%s",a,a); printf(" the c address is 0x%p,%s",c,c); printf(" the p address is 0x%p,%s",p,p); printf(" the d address is 0x%p,%s",d,d); return 0; }
上面的程序说明在常量区只保留一份相同的数据。