LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1692|回复: 17

知其然,必知其所以然

[复制链接]
发表于 2006-4-13 09:23:38 | 显示全部楼层 |阅读模式
在32字长的CPU中他的内存寻址空间是2*32bit, 内存地址是0x00000000~0xffffffff,当考虑到分段,每个段内寻址的地址(假设0x000000~0xffffff)也大于一个字节(认为一个内存单元是一个字节长度)的所能存储的长度。现在这样做:


  1. char  *chP1 = NULL;
  2. char  *chP2 = NULL;
  3. char str[] = "I love you honey";
  4. chp1 = str;
  5. chP2 = (char *)malloc(sizeof(char));
复制代码


问题是:
1. 首先在内存中的bss段中分配chP1(和我刚才讲到的段不同)占用一个内存单元,接着里面存放的是一个字符串“I love you honey"的内存段中的地址(当然是字符”I“ 所对应的地址,但是这个地址长度在chP1 中能装的下吗?
2. 当编译器已经为chP2分配了在bss段中的空间,如果再用malloc(),那么不是既在heap中分配了空间又在bss段中分配了空间吗?
3. 当为变量分配了内存空间,当使用变量时,找到内存变量中的内容是不是通过变量本身的地址已经在CPU的寄存器中的缘故吗?还是有其他方法? (平时只管用变量,但是却不知道如何找到变量在内存中的地址的,从而找到地址中的数据)
发表于 2006-4-13 09:55:17 | 显示全部楼层
1. chP1 的类型是指针,占 4 bytes, 不是一个,所以可以存放 str 的地址;
2. bss 中存放的是 chP2 的地址,而 heap 中用 malloc 分配的是 chP2 所指向的内容,二者不同;
3. 当执行程序被装入内存,所有的变量已经在内存中定位,访问变量就是访问绝对地址的内容。写一个最简单的 c 程序,看一下他的汇编代码就明白了;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-13 12:02:13 | 显示全部楼层
1:

  1. char  ch1;
  2. char  *chp1;

  3. fprintf(stdout, "%d\n", sizeof(ch1));
  4. fprintf(stdout, "%d\n", sizeof(chp1));
复制代码


2:先假设一个内存单元是一个字节。

  1. char  *chP0;
  2. char  *chP1 = NULL;
  3. chP1 = (char *)malloc(sizeof(char));
  4. char  *chP2 = (char *)malloc(sizeof(char));

  5. ....
  6. bss                  
  7. ----------------
  8. 随机
  9. ----------------
  10. 随机
  11. ----------------
  12. 随机
  13. ----------------
  14. 随机
  15. ----------------
  16. (第一句时内存分配图)
  17. data                          heap
  18. ---------------           --------------------
  19. NULL                        (empty)
  20. ---------------           --------------------
  21. NULL
  22. ---------------           --------------------
  23. NULL
  24. ---------------          ---------------------
  25. NULL
  26. ---------------          ---------------------
  27. (第二句时内存分配图)
  28. data                          heap
  29. ---------------           --------------------
  30. 0x00                         (empty)               0x00ff
  31. ---------------           --------------------
  32. 0x00                                                 0x0100
  33. ---------------           --------------------
  34. 0x0f                                                  0x0101
  35. ---------------          ---------------------
  36. 0x0f                                                  0x0102
  37. ---------------          ---------------------
  38. (第三句时内存分配图)
  39. data                         heap
  40. ----------------         ---------------------
  41. 0x00                        (empty)                0x00ff
  42. ----------------         --------------------
  43. 0x00
  44. ----------------
  45. 0x0f
  46. ----------------
  47. 0x0f
  48. ----------------

复制代码

(第四句时内存分配图)

*chP2=0x00ff,指针和他所指的变量是不是连续的?
回复 支持 反对

使用道具 举报

发表于 2006-4-13 22:42:24 | 显示全部楼层
Post by sybaselu
  
*chP2=0x00ff,指针和他所指的变量是不是连续的?

指针在 bss 中,他所指的变量在 heap 中,二者不连续;

  1.     char* chp0;
  2.     char* chp1;
  3.     chp1 = (char*)malloc(sizeof(char));
  4.     char* chp2 = (char*)malloc(sizeof(char));

  5.     printf ("&chp0=%x\n", &chp0);
  6.     printf ("&chp1=%x  chp1=%x \n", &chp1, chp1);
  7.     printf ("&chp2=%x\n", &chp2);
复制代码

我的输出:

  1.     &chp0=bfe97ed4
  2.     &chp1=bfe97ed0  chp1=804a008
  3.     &chp2=bfe97ecc
复制代码


btw, lz 的那个图是怎么搞出来的?gdb?看不太懂的说;
回复 支持 反对

使用道具 举报

发表于 2006-4-13 23:17:06 | 显示全部楼层
以楼主对c语言的了解,现在真的没必要抠的这么细,先有个感性认识,写多了再上升到理性高度。
说的有点不客气,因为看过楼主的几个帖子,发现楼主对基本c编程还不熟,却在深挖一些底层的东西。个人认为,目前没有必要。要提高c水平,认真看K & R写的<<C程序设计>>这本书就好
回复 支持 反对

使用道具 举报

发表于 2006-4-13 23:51:28 | 显示全部楼层
肯定是上课不认真听讲:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-14 10:41:35 | 显示全部楼层
发现楼主对基本c编程还不熟,却在深挖一些底层的东西

At first, Ow! frankly speaking, I really give you a great thanks and advices from deepest inner heart. Althought your advcies are so useful for me, I don't agree with your pointview yet. do you know why ? the simpliest reason is that the topic is not  lowest level stuff at all, it is just principle of C lanauage.
Second, I certainly know that my unstanding of C lanauage is so poor that I have lots of other stuffs to learn. however, you should give me answer about my question NOT somethings
which are not related with my question
Thanks in advance,please forgive me and forget, thanks again
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-14 10:51:58 | 显示全部楼层
指针在 bss 中,他所指的变量在 heap 中,二者不连续;
Thanks, but I do not think you understank my means, well.
  1. char *chP2 = NULL;
  2. chP2=(char *)malloc(sizeof(char));
复制代码
if code likes this , your explaintation is right , but if code likes follow:
  1. char *chP3 = "I love you honey"
复制代码
so how does memory to be aranged ?
回复 支持 反对

使用道具 举报

发表于 2006-4-14 12:00:59 | 显示全部楼层
Post by sybaselu
you should give me answer about my question NOT somethings
which are not related with my question


这想法不太好,你可以提问题,但别人没有义务回答,大家有自由说与你问题无关的事的,而且从旁观者角度看,littlepig那样说完全是善意的忠告。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-14 12:15:34 | 显示全部楼层
致歉,表达有问题。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表