自己对“一个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”的结束符一样。即使你越界了,那块空间不是我们要处理的,也没关系。以上说到的问题是理想化的。我个人的猜想,很久没研究语法细节了,说错了大家指出批评!!
- 自己对“一个C的实验及疑惑 ”一文中问题的解释!
- 一个C的实验及疑惑
- 自己一个疑惑的问题
- 百钱百鸡问题的一个疑惑
- 一维数组让人疑惑的一个问题
- 新手对COM的认识及疑惑
- 对session的原理解释以及自己实现一个session
- 针对importNew 网站中的《面试总结》一文中涉及到的问题,自己的一点总结(1)
- 针对importNew 网站中的《面试总结》一文中涉及到的问题,自己的一点总结(2)
- 自己的疑惑
- 模板编程的几点疑惑及解释
- 对黑洞的疑惑
- 对Malloc的疑惑!
- 对internal_add_timer 的疑惑
- 对网站的疑惑
- 对搜索的疑惑
- 《六大控制让组播业务可管理》一文中的几个专业术语的解释
- 一个对随机数的解释
- Unix操作系统基础2-Unix通信
- 用PHP开始你的MVC(三)实现你的Model层
- 用PHP开始你的MVC (四)实现View层
- 用力看就是盲,执著于聪明就是蠢
- PHP:MVC迷思
- 自己对“一个C的实验及疑惑 ”一文中问题的解释!
- 面对慵懒,引入竞争机制和自由
- 一切从基础开始Linux入门命令篇
- 我是一个反复无常的程序员
- 一位老工程师给年轻人的“十大忠告”
- Linux根目录下主要目录功能说明
- Linux下添加硬盘,分区,格式化详解
- 虚拟机上Redhat linux9.0的VMware Tools详细图文教程
- hcvtjsjx