精华内容
下载资源
问答
  • C语言指针越界访问举例 - C 语言程序设计
    2021-05-20 10:45:06

    指针越界访问举例

    我们都知道const修饰的是一个常量,是不可以被改变的量。但是在C语言中,它也许是一个中看不中用的修饰符。它是希望我们不去改变它的值,但是实际上C却不能阻止我们去修改它。和C++,Java不同,C++中的const就不能被改变。C中就并没有这种强化,当然也有它的道理。下面我们来看一个例子操作一下const常量:

    测试代码如下

    我们试图去修改一个常量的值。

    运行结果如下

    由于我们已经定义a为一个int类型的常量,所以我们不能再将一个a作为等式左边的量去修改它的值,这个时候编译器就会提示我们a是一个只读的量。这个时候编译器还会阻止我们去修改它的值。

    测试代码如下

    p指向的是b的地址,但是由于我们对它进行了一个越界的访问,使它的地址加了4个字节,指向了a的地址。此时我们通过指针对a的值进行修改。

    运行结果如下

    可以看到a的值被我们改变了。

    C中的const告诉我们这只是一个尽量不要去改变的值,告诉编译器在编译的过程中尽量不要改变,但是在运行的时候就没有办法保证,这也可能是C对于底层操作的一个思想。和C++面向对象和应用开发的方式思路不太一样。C面向的是内存,而C++更多的是面向事物,对象之间的关系。

    更多相关内容
  • C语言对数组下标不做检查,指针常常越界访问;我们编程时要特别注意。一、示范代码#include#includeint a[10];int b[10];void main(){memset(a,0,sizeof(int)*10);memset(b,0,sizeof(int)*10);a[10]=10;cout<}...

    C语言对数组下标不做检查,指针常常越界访问;我们编程时要特别注意。

    一、示范代码

    #include

    #include

    int a[10];

    int b[10];

    void main()

    {

    memset(a,0,sizeof(int)*10);

    memset(b,0,sizeof(int)*10);

    a[10]=10;

    cout<

    }

    在上例中,编译链接通过,但程序运行结果 b[0]=10;

    输出a[10]和b[0]地址:

    #include

    #include

    int a[10];

    int b[10];

    void main()

    {

    cout<

    cout<

    }

    结果:

    a[10] 地址为 0x41454c

    b[0]地址为    0x41454c

    备注:上述程序在vc6.0下编译,不同编译系统地址值可能不同;但a[10]和b[0]地址值始终相同。

    二、解释

    连续定义的全局变量在内存中是连续存放的,同时C对数组下标不做检查;指针越界访问内存,编译器不会提示错误。利用越界的指针读写内存,轻则程序结果错误,重则直接导致程序崩溃。

    展开全文
  • C语言指针越界与野指针

    万次阅读 2016-11-23 12:57:10
    指针 1,指针变量未初始化 2,指针变量直接释放,没有置NULL 3,指针变量超越了其指向变量的作用范围,这种情况下,其所指向的变量已经不存在,而我们认为对指针进行操作依然指向该变量,这种情况危害最大。 ...

    野指针

    1,指针变量未初始化

    2,指针变量直接释放,没有置NULL

    3,指针变量超越了其指向变量的作用范围,这种情况下,其所指向的变量已经不存在,而我们认为对指针进行操作依然指向该变量,这种情况危害最大。

    如果对野指针进行了操作,那么很有可能造成不可预计的后果,因为你不知道野指针指向的内存区域的具体情况。

    野指针不做过多的介绍,要通过养成良好的编程习惯,尽量避免野指针的存在。


    指针越界

    指针越界,发生越界访问也会造成严重的后果。


    typedef struct x


    char a, b;
    struct x *p;
    }x;


    int main(void)
    {
    x c,*q;
    c.p = &c;
    q = &c;//假设q=&c为0x00000000
    q = q + 1;此时q=0x00000008
    printf("%p\n",&c.a);
    printf("%p\n", &c.b);
    printf("%p\n", c.p->p);
    printf("%p\n", q);
    printf("%p\n",q->p);//此时q=0x00000012,所打印的是0x00000012内存处保存的值
    c.p = c.p + 1;
    printf("%p\n", c.p);
    printf("%p", c.p->p);//同上
    getchar();
    return 0;
    }

    结构体指针p发生了越界,我们想要打印的值变成了下一片8字节内存里面的值,如果对该内存进行访问,那么可能造成不可预知错误。

    对于结构体指针进行+1操作,其值直接加上结构体的大小,指向下一片结构体内存。


    那么结构体指针如何访问结构体内部的变量呢?

    1、在知道结构体的情况下直接使用->对结构体内部变量进行访问,获得是变量的值,而不是变量的地址,这是显式访问。而->在内部汇编代码上实际上也是根据地址加上偏移来实现对内存的访问。

        printf("%p\n",q->a);

      00D13D43 8B 45 E4             mov         eax,dword ptr [q]  ;此处将q里面保存的结构体首地址传给eax
    00D13D46 0F BE 08             movsx       ecx,byte ptr [eax]  ;此处取了q地址偏移一个字节出的内存地址
    00D13D49 8B F4                mov         esi,esp  
    00D13D4B 51                   push        ecx  
    00D13D4C 68 B0 58 D1 00       push        0D158B0h  
    00D13D51 FF 15 10 91 D1 00    call        dword ptr ds:[0D19110h]  ;printf()函数打印

    2、通过结构体的首地址+偏移来访问结构体的内部变量,隐式访问。

         这里可以通过定义一个char类型的指针,因为char一般只有一个字节,访问起来方便。

    通过指针对变量进行访问,实际上就是通过内存地址访问实现的,通过改变指针的值,从而实现了指向内存地址的改变。

    指针

    指针根据自身类型的不同,来决定自身的+1操作应该加上多少个字节,而不是只+1个字节。通常int 4个字节,char是1个字节,结构体是结构体的大小。


    展开全文
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼第一个循环之后指针在rain[6][0],已经越界了,不过好像没有什么事情发生,请问下指针越界会有什么后果?程序如下:/* rain.c 计算年降水总量,年平均,月平均 */#...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

    第一个循环之后指针在rain[6][0],已经越界了,不过好像没有什么事情发生,请问下指针越界会有什么后果?

    程序如下:

    /* rain.c 计算年降水总量,年平均,月平均 */

    #include

    #define MONTHS 12

    #define YEARS 5

    int main(void)

    {

    const double rain[YEARS][MONTHS] = {

    {4.3, 4.3, 4.3, 3.0, 2.0, 1.2, 0.2, 0.2, 0.4, 2.4, 3.5, 6.6},

    {8.5, 8.2, 1.2, 1.6, 2.4, 0.0, 5.2, 0.9, 0.3, 0.9, 1.4, 7.3},

    {9.1, 8.5, 6.7, 4.3, 2.1, 0.8, 0.2, 0.2, 1.1, 2.3, 6.1, 8.4},

    {7.2, 9.9, 8.4, 3.3, 1.2, 0.8, 0.4, 0.0, 0.6, 1.7, 4.3, 6.2},

    {7.6, 5.6, 3.8, 2.8, 3.8, 0.2, 0.0, 0.0, 0.0, 1.3, 2.6, 5.2}

    };

    int i, j;

    const double (*pr)[MONTHS];

    double group;

    double total = 0;

    pr = rain;

    printf(" 年份 降水总量\n");

    // 外循环控制指针在行与行之间移动,内循环执行一次,指针移到下一行起始位置

    for(i=0; i

    // 最后一次运行完之后指针越界了

    {

    // 内循环,循环MONTHS次,每次循环取出每一行的第j+1个元素,加在group上

    for(group=0, j=0; j

    group += *(*pr + j);

    printf("%5d %15.1lf\n", 2000+i, group);

    total += group;

    }

    printf("五年平均年降水量:%5.1lf\n", total/YEARS);

    printf("五年间各月平均降水量\n");

    printf("月份: 1 2 3 4 5 6 7 8 9 10 11 12\n");

    printf("降水量:");

    for(pr=rain, i=0; i

    {

    for(group=0, j=0; j

    group += *(*(pr + i) + j);

    printf("%5.1lf", group/YEARS);

    }

    putchar('\n');

    return 0;

    }

    展开全文
  • C语言中,指针的概念有点难懂,使用起来稍微不注意,也会遇到各种问题。在本文中,我列举出了几个使用指针不当的方式,希望朋友们在编程实践中也多多注意。一、野指针指针这个东东是经常被人提及的,其危害也是...
  • 摘要:该文从指针C语言中的作用入题,介绍了指针使用过程中常见的几种错误,并提出了改进方法。然后针对指针与数组,总体介绍了它们之间的联系与转换,并详细描述了数组越界的两类错误,最后我们经过详细分析,...
  • C语言越界访问问题

    2021-11-07 17:11:05
    代码如下:出现访问越界,结果会是什么呢? int main() { int i = 0; int arr[10] = { 1,2,3,4,5,6,7,8.9,10 }; for (i = 0; i <= 12; i++) { arr[i] = 0; printf("肖维鹏好帅\n"); } return 0; } ...
  • 来自公众号:技术让梦想更伟大所谓的数组越界,简单地讲就是指数组下标变量的取值超过了初始定义时的大小,导致对数组元素的访问出现在数组的范围之外,这类错误也是 C 语言程序中最常见的错误之一...
  • 内存越界是软件系统主要错误之一,其后果往往不可预料且非常严重。更麻烦的是,它出现的时机是随机的,表现出来的症状是随机的,而且造成的后果也是随机的,这会使程序员很难找出这些 Bug 的现象和本质之间的联系,...
  • 详详解解C语语言言数数组组越越界界及及其其避避免免方方法法所谓的数组越界,简单地讲就是指数组下标变量的取值 过了初始定义时的大小,导致对数组元素的访问出现在数组的范围之外,这类错误也是 C 语言程序中最...
  • C语言指针的使用

    2022-03-02 19:43:50
    指针C语言中比较难懂的部分,但是指针又是C语言的精华,所以指针是每个C语言开发人员都必须掌握的知识。在学指针之前先来了解变量在内存中的分布。 在上图中,定义了3个变量a、b、c,这三个变量的地址分别是0x...
  • C语言指针的易错点

    2021-05-26 03:39:25
    1.内存泄漏:申请的堆内存没有释放。2.内存污染:前面非法操作使用内存(没有报错),后面写着写着就出错。如下代码:当结构体中只有划线部分代码时,在编译器中编写不会报错,但此时已经造成非法操作...指针越界:如...
  • C语言指针入门,图解+实例

    多人点赞 2022-02-12 23:33:34
    1.指针是什么 指针是内存中一个最小的单元编号,也就是地址 通常我们口中说的指针其实是指针变量:变量中存放着地址 那么地址,内存,指针又有怎样的关系? 为了对内存更方便的管理使用,我们把内存划分为一个一个...
  • c语言 指针

    2020-12-16 09:09:29
    目录c语言 指针c语言 指针概念c语言 指针大小c语言 指针类型的意义 c语言 指针 c语言 指针概念 指针是个变量,存放内存单元的地址(编号)。 #include <stdio.h> int main() { int a = 10; // 在内存中开辟一...
  • 本文章旨在全面梳理C语言指针的知识点,内容非常宏大且精细,希望可以给看到本篇文章的人带来全新的指针认识。本文为初阶版,我会尽快创作出高阶版的指针,喜欢本文的可以点个关注本文章主要内容1. 什么是指针先来看...
  • C语言指针就应该这么学 - 指针的进阶篇

    万次阅读 多人点赞 2021-05-27 16:12:19
    C语言初识篇我们大概的对指针有了一些简单认识和概念。在正式对指针进阶的学习之前,先回忆下: 指针就是一个变量,用来存放地址,地址唯一标识一块内存空间 指针的大小是固定的4/8个字节(32位平台/64位平台) ...
  • c语言指针面试常见问题指针的使用,一直是c语言面试题中必考的部分,因为指针本身使用的复杂性与普适性,所以考点非常多,而且也可以与其他知识相互结合,因此我们将会使用五篇专题的篇幅来介绍指针。分析下面的程序...
  • C语言指针常见错误用法1、使用未初始化的指针int *p;*p = 5;解释:p是一个指向未知地址的指针,给p赋值,相当于给一个未知地址的内存赋值,非常危险。2、错用指针int changeP(int *p) {int b = 5;p = &b;}int a ...
  • 指针 指针定义: 在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量...
  • 若不是将可能导致访问越界,或丢数据。 4.3注意强制转换的使用细节 这也是笔者犯的一个很蠢的错误,借此机会和大家分享一下。 void Fill_SAI_Buff1(void)//缓冲区填充 { if(buff1_attribute==NULL){ return; } ...
  • 如何深入掌握C语言指针(详解)

    多人点赞 2021-08-06 22:46:35
    指针越界访问 指针指向的空间释放 如何规避野指针 指针运算 指针+-整数 指针-指针 指针的关系运算 对于指针比较 指针和数组 二级指针 使用及运算 指针数组 前言 本文主要讲解点 指针是什么 指针和...
  • c语言数组越界的避免方法

    千次阅读 2019-09-08 16:27:15
    2、对数组做越界检查,确保索引值位于合法的范围之内 传递数组参数的时候,一定要带上传入数组的长度,比如: void Init(int arr[],size_t arr_len) {  size_t i=0;  for(i=0;i;i++)  {  arr[i]=i;  } } ...
  • C语言指针的基本知识

    千次阅读 多人点赞 2022-03-18 14:11:06
    C语言指针的基本知识详解
  • C语言指针的运算

    2020-03-31 11:10:43
    义,还可能越界内存区域; 可以进行: 1)比较大小(>):可以判断指针位置的高低,如一个指向0x80008000, 一个指向0x80008020; 2)赋值运算(=):类型相同指针之间可以进行赋值运算; 3)减法运算(-):两个...
  • 1.数组越界,是指访问了超出数组定义的内容。实例:inta[2];数组a定义了2个元素!a[0],a[1]:没有越界。...a[2]是越界了,而且编译器不会警告的,这是C语言的特性,a[2]可以解析成*(a+2),a是数组的基地址,...
  • c语言初级指针详解(图片加解析通俗易懂)

    千次阅读 多人点赞 2022-04-04 19:49:22
    2.指针指针类型 3.野指针? 4.指针运算 5.指针和数组 6.二级指针 7.指针数组 1.指针是什么? 1.指针是内存中一个最小单元的编号,也就是地址。 2.指针通常指的是指针变量,是用来存放内存地址的变量。 ...
  • C语言指针知识点

    千次阅读 多人点赞 2019-05-08 21:11:02
    地址与指针 每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。 请看下面的实例,它将输出定义的变量地址: #include <stdio.h> ...
  • 指针变量的赋值指针变量同普通变量一样,使用之前不仅要定义说明, 而且必须赋予具体的值。未经赋值的指针变量不能使用, 否则将造成系统混乱,甚至死机。指针变量的赋值只能赋予地址, 决不能赋予任何其它数据,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,187
精华内容 10,874
关键字:

c语言 指针 越界