c++ - 最近在学C的指针,为什么申请一个字节的空间缺可以放多个内容呢
大家讲道理
大家讲道理 2017-04-17 11:55:51
[C++讨论组]

小弟最近在学指针,刚学到空类型指针 发现 只要申请1个字节的空间居然可以赋值20个字节的内容 而且都没报错 这是为什么呢?

void *p = malloc(1); //给空类型指针分配20个字节
    int *px = (int*)p;  //把空类型指针地址赋值给int指针
    for (int i = 0; i < 5; i++) {

        px[i] = i+10;
    }
    for (int i = 0; i < 5; i++) {
        printf("\r\n%d",px[i]);
    }
    printf("%x",px);
大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(9)
阿神

编译器不检查越界。不允许数组下标越界,并不是因为界外没有存储空间,而是因为界外的内容是未知的。无论界外的空间是否有被利用,我们都可以访问那块内存

于是,即使没有定义a[-1]或者a[i]//(i>a.lenghth(),也可以访问

编译阶段从a取首地址,然后根据下标取偏移量,得到*(a+i)这块内存。

不检查越界问题的好处有:
1. 检查的话编译器必须在生成的目标代码中加入额外的代码用于程序运行时检测下标是否越界,导致程序的运行速度下降
2. 更加自由

黄舟

这样做无疑不太合理,C语言设计的很自由,它认为编程员应该清楚自己在做什么。这跟C语言不检查数组越界一样,这种问题是设计理念的问题,自己注意不要这么做就是了。

天蓬老师

未定义行为来说,报不报错,崩不崩溃,都很正常,因为他叫未定义行为

黄舟

其实你已经使用了别的地址了,只是你自己没发现而已,而编译器是默认你自己是知道的

怪我咯

已经在非法访问内存了,不过越界19个字节不算太多,暂时没有引发什么重大问题而已,毕竟不是所有的内存访问都会引起程序崩溃,有些错误没法显示表达出来

PHP中文网

你会发现其实下面一段代码正常编译,而且输出的结果没有异常

int a[10];
a[-1]=2;
a[11]=4;
printf("%d\n%d\n",a[-1],a[11]);

但是!
你这样做是非法访问内存!在实际中会造成不可估计的后果!

为了更能说明问题 我修改了一下代码

    int a[10],b;
    b = 0;
    a[-1]=2;
    printf("%p\n%p\n",&b,&a[-1]);
    printf("%d\n%d\n",b,a[-1]);

结果如图

现在你意识到问题的严重性了吧?

PHP中文网

你出现的问题,就是这个网站模仿的那个网站的名字

伊谢尔伦

c语言是比较随意的语言 虽然可以运行成功 但是这种做法绝对 一次成功并不代表绝对没问题!

伊谢尔伦

能够编译通过,并且运行结果看起来正确的代码,并不代表里面不是“藏污纳垢”的!

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号