自己对“一个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”的结束符一样。即使你越界了,那块空间不是我们要处理的,也没关系。以上说到的问题是理想化的。我个人的猜想,很久没研究语法细节了,说错了大家指出批评!!