最近在学C的指针,为什么申请一个字节的空间缺可以放多个内容呢

发布于 2022-09-01 07:01:03 字数 340 浏览 14 评论 0

小弟最近在学指针,刚学到空类型指针 发现 只要申请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);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

调妓 2022-09-08 07:01:03

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

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

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

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

陌上芳菲 2022-09-08 07:01:03

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

相思故 2022-09-08 07:01:03

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

邮友 2022-09-08 07:01:03

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

秋日私语 2022-09-08 07:01:03

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

浪漫人生路 2022-09-08 07:01:03

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

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]);

结果如图

图片描述

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

寄居人 2022-09-08 07:01:03

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

踏雪无痕 2022-09-08 07:01:03

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

草莓味的萝莉 2022-09-08 07:01:03

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文