|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
在学习Linux、Windows下C语言内存布局(内存模型)的时候有些疑惑。
示例代码
1. #include <stdio.h>
2.
3. char *str1 = "biancheng"; //字符串在常量区,str1 在全局数据区
4. int n; //全局数据区
5.
6. char* func(){
7. char *str = "C 语言"; //字符串在常量区,str 在栈区
8. return str;
9. }
10.
11. int main(){
12. int a; //栈区
13. char *str2 = "01234"; //字符串在常量区,str2 在栈区
14. char arr[20] = "56789"; //字符串和 arr 都在栈区
15. char *pstr = func(); //栈区
16. int b; //栈区
17.
18. printf("str1: %#X\npstr: %#X\nstr2: %#X\n", str1, pstr, str2);
19. puts("--------------");
20. printf("&str1: %#X\n &n: %#X\n", &str1, &n);
21. puts("--------------");
22. printf(" &a: %#X\n arr: %#X\n &b: %#X\n", &a, arr, &b);
23. puts("--------------");
24. printf("n: %d\na :%d\nb: %d\n", n, a, b);
25. puts("--------------");
26. printf("%s\n", pstr);
27.
28. return 0;
29. }
问题一:表达式的左值和右值都在相应的内存区域么?
例如上面代码,第3行str,左值全局变量是在全局数据区,str是一块内存的标记么?标记的这块内存存的是指向字符串常量的地址么?右边值是字符串常量"C 语言" 在常量区,是在常量区的内存上,内存上记录的是“C语言”还是指向“C语言”的地址。
问题二:那他们之间是如何指向的,是编译规定还是硬件规定,还是系统规定?
|
|