数组溢界地址的正确使用: 即 int a[6] 中的 a[-1] 和 a[6] 正确使用
正如大家所知道的那样:
数组 int a[6] , 编译器阅读到这句数组定义,会为分配6个int 类型的地址;a[0] a[1] a[2] a[3] a[4] a[5]。我们 能够正确的使用这6地址内容来存放数据。而本文想说的是a[0]前一个地址和 a[5] 后一个地址的正确使用。
可能有人会有疑问,这两个地址是非法的。是不同意訪问和使用的。
幸运的是,我们并不须要引用这两个元素。而仅仅是引用这两个元素的地址,而且着脸个地址在全部C语言实现中都是存在的。ANSIC C 标准明白同意这样的使用方法:数组中实际不存在的“溢界”元素地址位于数组所占内存之后,这个地址可用于进行赋值和比較。当然假设要引用元素就是非法的。
可能有人会问,怎样使用?
答案就是“不正确称边界”
解释下就是“当我们使用指针遍历数组元素时使用”
以下是一个简单的样例:
#include <stdio.h>
#include <stdlib.h> int main(void)
{
int a[10];
int *p;
int i=0;
for(p=a;p!=&a[10];p++)
{
*p=i;
i++;
}
for(p=a;p!=&a[10];p++)
printf("%d\n", *p);
return 0;
}
程序能够正常执行。使用 gcc编译器 centOS操作系统
执行结果:
[trageday@trageday C_test]$ gcc -o arry_over_test arry_over_test.c
[trageday@trageday C_test]$ ./arry_over_test
0123456789
[trageday@trageday C_test]$
能够看到 for 循环中是使用了 P!=&a[10] 作为循环结束推断条件,是不是感觉有点 STL标准中 iterator 的感觉,对这就是不正确成边界的使用。当然a[-1]使用来从后往前遍历数组的不正确称边界。
尤其当你的数组元素是结构体。 类 等复杂结构时使用这两个地址能够简化操作。(前提是使用指针遍历数组)
数组溢界地址的正确使用: 即 int a[6] 中的 a[-1] 和 a[6] 正确使用的更多相关文章
- C语言的数组名和对数组名取地址
http://blog.csdn.net/zdcsky123/article/details/6517811 相信不少的C语言初学者都知道,数组名相当于指针,指向数组的首地址,而函数名相当于函数指针, ...
- C语言 对数组名取地址
作者 : 卿笃军 你有没有想过,对一个一维数组名取地址,然后用这个地址进行加减运算.这会出现什么样的结果呢? 演示样例: int a[5] = {1,2,3,4,5}; int *p = (int * ...
- [C++程序设计]多维数组元素的地址
设有一个二维数组a,它有3行4列.它的定义为int a[3][4]={{1,3,5,7},{9,11,13,15},{17,18,21,23}};a是一个数组名.a数组包含3行,即3个元 素:a[0] ...
- 数组名取地址所算数运算应注意的"trap"
数组名取地址所算数运算应注意的"trap" 直接看代码: #include <stdio.h> int main() { int array[5]; printf(&q ...
- C语言中对数组名取地址
在C/C++中,数组名相当于一个指针,指向数组的首地址.这里“相当于”不代表等于,数组名和指针还是有很多区别的,这个在<C陷阱与缺陷>里有详尽的讲述.而这里要说的是对于数组名取地址的这么一 ...
- 数组名和数组名取地址&
在C中, 在几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址. 它的类型取决于数组元素的类型: 如果它们是int类型,那么数组名的类型就是“指向int的常量指针“ ...
- 对数组名取地址 a[ ],&a
C语言规定,数组名代表数组的首地址,也就是第0号元素的地址.所以a==&a[0] 但对数组名取地址时却要注意了,在理解“对数组名取地址”这一表达式的含义时一定要记住:数组名是“数组”这种变量的 ...
- C/C++拾遗(一):关于数组的指针和数组元素首地址的一道经典题
代码例如以下: #include <stdio.h> int main(void) { int a[5] = {1, 2, 3, 4, 5}; int *ptr = (int *)(&am ...
- C二维数组用指针地址遍历
#include <stdio.h> #include <stdlib.h> int main(){ int a = 100; void *p = &a; printf ...
随机推荐
- HDU 1113 Word Amalgamation (map 容器 + string容器)
http://acm.hdu.edu.cn/showproblem.php?pid=1113 Problem Description In millions of newspapers across ...
- ubuntu13.10升级到ubuntu14.04
Upgrading from Ubuntu 13.10 To upgrade from Ubuntu 13.10 on a desktop system: Open Software Sources. ...
- Codeforces Gym 100015F Fighting for Triangles 状态压缩DP
F Fighting for Triangles Description Andy and Ralph are playing a two-player game on a triangular bo ...
- elasticsearch源码分析之search模块(client端)
elasticsearch源码分析之search模块(client端) 注意,我这里所说的都是通过rest api来做的搜索,所以对于接收到请求的节点,我姑且将之称之为client端,其主要的功能我们 ...
- USACO 2.1 Hamming Codes
Hamming CodesRob Kolstad Given N, B, and D: Find a set of N codewords (1 <= N <= 64), each of ...
- scrollView中内部控件的悬停
以下图为例,图片,红色view和蓝色view是添加在scrollView上的,向上拖动,红色view停留在屏幕顶端不动,其它的继续滚动,向下拖动后,红色view跟着下来 代码如下:(注意的是scrol ...
- SQL Server 计算汉字笔画函数
create function [dbo].[fun_getbh](@char nchar(2)) returns int as begin return( case when unicode(@ch ...
- Linux top命令简解
简介: top 命令是最流行的性能监视工具之一,它是一个优秀的交互式工具,用于监视性能.它提供系统整体性能,但报告进程信息才是 top 命令的长处. top 界面分为两个部份,光标上面部份显示关于系统 ...
- Apache2.2伪静态配置
最近由于工作的需要要配置一下Apache的伪静态化,在网上搜了好多都无法完成,所以觉得有必要在这里写一下. 第一步:打开Apache的httpd.conf文件,把LoadModule rewrite_ ...
- Java用freemarker导出Word 文档
1.用Microsoft Office Word打开word原件: 2.把需要动态修改的内容替换成***,如果有图片,尽量选择较小的图片几十K左右,并调整好位置: 3.另存为,选择保存类型Word 2 ...