一个简单的指针访问错误

对于几乎没什么工程经验的我来说,找个印象深刻的bug也是一件很难的事情啊。下面还是刚刚接触C语言时候犯过的一个错误,

刚刚接触指针,写了一段代码,通过指针int * pa访问动态数组int *a = (int *)malloc(sizeof(int)*2)。

初始化pa = a;

写了个循环遍历数组时,不想通过下标来访问,而是通过加循环索引idx来遍历,每次循环pa = pa + idx;idx初始化为0,每次循环idx++

for(idx=0;idx<2;idx++){

  pa = pa+idx;

  printf("%d\n",*pa);

}

运行之后没问题。

因为数组大小只有2。

换个稍微大一点的输入,数组就越界了。

这个错误的产生在于代码不规范,其实,循环中pa = a+idx,或者pa++或者干脆使用数组下标来遍历就可以改正这个错误。

如果申请两个连续的堆空间,那么在越界的时候是否会访问到另一个堆空间的值从而造成一些隐患呢?

产生这个想法是因为之前看过的一个关于缓冲区溢出的文章,同样是越界访问,不同只在于读和写的区别以及堆空间和栈空间的区别。

错误虽小,隐患无穷。希望以后自己可以引以为戒。

时间: 2024-08-27 12:13:45

一个简单的指针访问错误的相关文章

一个简单的网站访问过程

对于我们一个简单的网站访问,涉及到的技术: 1.用户访问浏览器时,浏览器会向服务器发出一个 HTTP 请求: 2.服务器接收到 HTTP 请求,Web Server 进行相应的初步处理,使用服务器脚本生成页面: 3.服务器脚本(利用Web Framework)调用本地和客户端传来的数据,生成页面: 4.Web Server 将生成的页面作为 HTTP 响应的 body,根据不同的处理结果生成 HTTP header,发回给客户端: 5.客户端(浏览器)接收到 HTTP 响应,通常第一个请求得到的

利用JS跨域做一个简单的页面访问统计系统

其实在大部分互联网web产品中,我们通常会用百度统计或者谷歌统计分析系统,通过在程序中引入特定的JS脚本,然后便可以在这些统计系统中看到自己网站页面具体的访问情况.但是有些时候,由于一些特殊情况,我们需要自己来设计统计系统.由于前段时间公司的业务需求,我也是自己尝试了下,本文提供的是一个基本思路,统计系统也比较简单. 几个基本统计需求: 1.统计web每个页面用户访问量 2.统计用户访问者的和IP地址信息 3.页面之间的跳转情况 4.访问高峰时间段 服务器结构: 数据库表设计: 以上只是我简单列

从一个简单例子来理解js引用类型指针的工作方式

? 1 2 3 4 5 6 7 <script> var a = {n:1};  var b = a;   a.x = a = {n:2};  console.log(a.x);// --> undefined  console.log(b.x);// --> [object Object]  </script> 上面的例子看似简单,但结果并不好了解,很容易把人们给想绕了--"a.x不是指向对象a了么?为啥log(a.x)是undefined?".&

一个简单的函数指针测试例子

一般函数指针的一个简单测试.将函数放到vector里面,将函数作为形参. 1 typedef void(*GTestFunPtr)(int, int); 2 3 void test1(int a, int b) 4 { 5 std::cout << "test1:" << a + b << std::endl; 6 } 7 8 void test2(int a, int b) 9 { 10 std::cout << "test2

一个简单的顺序表基础操作示例

最近学计算机软件基础,学到了线性表.下面就将线性表中最简单的顺序表的一个简单示例贴出,方便大家探讨.(以及后面对函数传参的一个小分析,其实这才是重点) 1 ////需求分析 2 //1.线性表递增有序,删除重复元素 3 //2.线性表逆置 4 //3.寻求最大值 5 6 #include<stdio.h> 7 8 typedef int ElementType; 9 typedef struct _struct 10 { 11 ElementType SequenceList[100]; 12

win32汇编实现一个简单的TCP服务端程序(WinSock的简单认知应用)

Windows网络编程,相信好多人都知道,但是我们一般都是用其他语言编写,例如C,C++,JAVA,python等等,这些语言都可以,但是汇编语言比较底层,利用它,我们可以更清晰的了解到网络编程的内在部分,这是其他语言不能相比的,好了,废话不多说,这其实就是这次的目的(毕竟水平欠缺,还是先来按照罗云斌老师的WIN32汇编书上的例子加以学习,举一反三吧). 说道网络编程,现在我所接触到的程序开发,工具软件的使用,库等等都是基于Windows平台的,想要了解Windows的网络编程就必须要知道Win

Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值

Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇也就够了,不过我也尽量陈述的很详细 一.指针 要说指针,其实通俗易懂的话来说,他应该是保存内存地址的一个变量,我们来看一下小例子 #include <stdio.h> #include <stdlib.h> main(){ //int 变量 int i ; i = 5; //打印i的值

linux设备驱动第二篇:一个简单hello world驱动如何实现

上一篇介绍了linux驱动的概念,以及linux下设备驱动的基本分类情况及其各个分类的依据和差异,这一篇我们来描述如何写一个类似hello world的简单测试驱动程序.而这个驱动的唯一功能就是输出hello world. 在编写具体的实例之前,我们先来了解下linux内核下调试程序的一个重要函数printk以及几个重要概念. printk类似c语言的printf,是内核中输出打印信息的函数.以后驱动调试中的重要性不言而喻,下面先做一个简单介绍. printk的级别 日志级别一共有8个级别,pr

一个简单的税利计算器(网页版)

嗯嗯,做一个简单的网页版的税率计算器,功能比较简单,但是相对比较实用.因为参考了一些其他作品,所以在计算汇率的时候习惯性的是以美元做单位.具体的功能有着较为详细的标注.仅供大家学习参考下. <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>JavaScript Loan Calculator</title>