自己对“一个C的实验及疑惑 ”一文中问题的解释!

来源:互联网 发布:php改源码 编辑:程序博客网 时间:2024/04/28 04:45

自己对“一个C的实验及疑惑 ”一文中问题的解释!
早上看了要饭兄的BLOG,看到一个C的实验及疑惑一文。泛泛看了下,也对他的疑问发表下自己的看法:
  我写了一段代码如下:
#include <stdio.h>
#include<malloc.h>
#include<conio.h>


int main()
{
 struct  {
  char a1[10];
  int  a2[10];
 }my;
 

 char b1[10];
 int b2[10];
 int i;

 for(i=0;i<10;i++)
 {
  my.a1[i] = i;
  my.a2[i] = i;
  b1[i]    = i;
  b2[i]    = i;
 }
 
 printf("%p/n",&my.a1);
 printf("%p/n",&my.a1[10]);
 printf("%p/n/n",&my.a2);


 printf("%p/n",&b1);
 printf("%p/n",&b1[10]);
 printf("%p/n",&b2);
 return 0;
}

运行结果如下:
0012FF4C          //0012FF-86  便于解释最后两位弄成了十进制的
0012FF56   //0012FF-96
0012FF58   //0012FF-98

0012FF40          //0012FF-64
0012FF4A          //0012FF-74
0012FF18   //0012FF-24
Press any key to continue


现在就来解决文中提到的第3个问题:
3. e.age - e.stuno 为什么是12而不是10?结构里申明不是只有10吗?

    我们看到CHAR[10]其实只是占了10个字节的空间,只是INT[10]的起始地址减去CHAR的起始地址造成

了CHAR[10]为12的错觉。然后又发现,只在STRUCT中才回出现这种情况,一般的内存分配又是正常的。

    我的结论:
    其实很简单,还是越界问题,STRUCT内存分配是紧密性分配的,要保证所有的数据都在一块内存空间上。而一般的分配是随机的,可能在一块内存区上,可能不在,这个就要根据具体情况。
    假如一般的内存分配可能出现越界的情况,我们假设int  A[5],int B[5]两个数组,假如他们的地址空间是紧挨着的。然后一个新手来玩儿这两个数组,他对A[5]进行写入,那不是写到B[1]去了?!一般的内存分配可以不去理会这个问题。
    而结构体是紧密的,他的内存分配是一块儿的,更不能让你出现这种情况,于是他会在各个数据区域之间预留一块空间,就象每个字符串有个“/0”的结束符一样。即使你越界了,那块空间不是我们要处理的,也没关系。以上说到的问题是理想化的。我个人的猜想,很久没研究语法细节了,说错了大家指出批评!!