最近在学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);

c 指针 C++

秘刃十六夜 9 years, 7 months ago

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

liAya answered 9 years, 7 months ago

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


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

结果如图

图片描述

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

╲午夜秣班車 answered 9 years, 7 months ago

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

IceLady answered 9 years, 7 months ago

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

见习村支书 answered 9 years, 7 months ago

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

东方D某笨蛋 answered 9 years, 7 months ago

Your Answer