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

原创 2006年06月11日 12:02:00

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

一个疑惑,为什么在二维数组里可以自动换行存入字符串,以及冒泡的趟数问题?

#include #include #include #include #include #undef EOF #define EOF -1 #define N 20 /* 函数fun,该函...

关于《Java编程思想》注解篇的一个案例所遇到的疑惑-apt参数的问题

案例为提取接口的案例,里面有一条命令 apt -factory

阅读王垠《怎样写一个解释器》一文后的一些体会

http://www.yinwang.org/blog-cn/2012/08/01/interpreter 怎样写一个解释器 R2语言实现了表达式解释器,支持单变量let绑定、函数调用、函数作为参数传...
  • cteng
  • cteng
  • 2016-05-27 12:30
  • 1001

《第十五周实验报告1-1》---在《窗口程序设计及MFC 启蒙》一文案例的基础上,为应用程序增加求周长的功能

/* 【任务1】在《窗口程序设计及MFC 启蒙》一文案例的基础上,为应用程序增加求周长的功能。在报告 中展示主要的代码(至少包括自己定义的代码和包含通过在界面上设置产生的代码——理解文中“进 一步的回...

第十五实验报告一在《窗口程序设计及MFC 启蒙》一文案例的基础上,为应用程序增加求周长的功能

* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2012, 烟台大学计算机学院学生 * All rights reserved. * 文件名称:在《窗...

STC89C52单片机实验1-点亮一个发光二极管

/*-------------------------------------------------------------------------- REG51.HHeader file for ...

《C++第十三周实验报告4-1》---设计一个抽象类CSolid,含有两个求表面积及体积的纯虚函数。 设计个派生类CCube、CBall、CCylinder,分别表示正方体、球体及圆柱体。

/* 【任务4】设计一个抽象类CSolid,含有两个求表面积及体积的纯虚函数。 设计个派生类CCube、CBall、CCylinder,分别表示正方体、球体及圆柱体。 在main()函数中,定义基类的...

一个关于c/c++语言内存数据类型的实验

今天在群里有朋友问到编译器是怎么识别不同数据类型和处理他们的。如果学过汇编或者编译原理应该很好理解。 没学过的话也没关系,这里大概讲解一下。 在计算机内部其实是没有变量类型的,只有由 段地址+偏移地址...

java疑惑的问题

  • 2007-07-12 19:11
  • 1.18MB
  • 下载

vfork 挂掉的一个问题拓展实验二 (子进程使用exit退出时候的栈帧)

#include #include #include int main(void) { int var; var = 88; if ((pid = vfork()) < ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)