马老师 发表于 2020-10-21 21:58:58

指针问题

为什么这样会向0地址写入东西?
初始化指针的话不都是写成*p=0吗?这时候为什么不是向0地址写入?

sunrise085 发表于 2020-10-21 22:02:52

死循环,每执行一次,就会动态申请一次空间,所以最终会因为没有空间而报错
*p=0,是给分配的空间进行赋值,不是向0地址写入

马老师 发表于 2020-10-21 22:23:54

sunrise085 发表于 2020-10-21 22:02
死循环,每执行一次,就会动态申请一次空间,所以最终会因为没有空间而报错
*p=0,是给分配的空间进行赋值 ...

不好意思,我截图没截全,这题答案是B

马老师 发表于 2020-10-21 22:25:50

sunrise085 发表于 2020-10-21 22:02
死循环,每执行一次,就会动态申请一次空间,所以最终会因为没有空间而报错
*p=0,是给分配的空间进行赋值 ...

而且我试了试,不知道为啥程序不会退出

塔利班 发表于 2020-10-21 22:48:12

不是选D么,malloc返回的是不是void *的

马老师 发表于 2020-10-21 23:04:10

.

马老师 发表于 2020-10-21 23:09:10

塔利班 发表于 2020-10-21 22:48
不是选D么,malloc返回的是不是void *的

我用的dev-c++编译可以过

乐乐学编程 发表于 2020-10-21 23:17:43

马老师 发表于 2020-10-21 23:09
我用的dev-c++编译可以过

朋友,能不能将全部的代码发出来,我们试着运行一下,也好学习研究一下,好吗?

马老师 发表于 2020-10-22 10:06:09

乐乐学编程 发表于 2020-10-21 23:17
朋友,能不能将全部的代码发出来,我们试着运行一下,也好学习研究一下,好吗?

#include<stdio.h>
#include<stdlib.h>
int main(){
        char *p;
        while(1){
                p = malloc(1);
                *p=0;
        }
        return 0;
}

yuxijian2020 发表于 2020-10-22 10:17:17

我用的gcc调试首先,void* 赋值给 char*编译报错无法运行,然后加上强制类型转换之后,直接运行到死机,我可以很负责任的告诉你程序并没有退出{:9_229:}

LuLD 发表于 2020-10-22 10:52:39

支持 2 楼大佬 说的,死循环,最后会因为没有空间报错或直接死掉,*p = 0是写入数据 0

资治通鉴 发表于 2020-10-22 11:36:44

楼主啊,这道题选D

资治通鉴 发表于 2020-10-22 11:37:57

应该不存在分配不了地址的问题吧,操作系统会有保护的

永恒的蓝色梦想 发表于 2020-10-22 12:51:07

sunrise085 发表于 2020-10-21 22:02
死循环,每执行一次,就会动态申请一次空间,所以最终会因为没有空间而报错
*p=0,是给分配的空间进行赋值 ...

有的 malloc 分配失败会返回 NULL,导致0地址写入{:10_277:}

永恒的蓝色梦想 发表于 2020-10-22 12:52:14

塔利班 发表于 2020-10-21 22:48
不是选D么,malloc返回的是不是void *的

有的编译器支持这种隐式转换

马老师 发表于 2020-10-22 18:29:25

yuxijian2020 发表于 2020-10-22 10:17
我用的gcc调试首先,void* 赋值给 char*编译报错无法运行,然后加上强制类型转换之后,直接运行到死机,我可 ...

我把后边的1改成了很大的数,等个一两秒程序就结束了

马老师 发表于 2020-10-22 18:35:18

资治通鉴 发表于 2020-10-22 11:36
楼主啊,这道题选D

编译通过了,后面的数变的很大时,他会退出程序。
然后我把*p=0去掉之后,程序也不会退出了,会一直运行

乐乐学编程 发表于 2020-10-22 18:57:53

马老师 发表于 2020-10-22 10:06
#include
#include
int main(){


为了验证,我加了两条语句:

#include<stdio.h>
#include<stdlib.h>
int main(){
      char *p;
      while(1){
                p = malloc(1);
                *p=0;
                printf("%p\n",p);
      }
      printf("程序死循环了吗?");
      return 0;
}

证明答案 A、D是肯定不正确的,正确答案应该在B、C两个之间。启动 PhotoShop 软件对下面的截图进行编辑,并没有卡的感觉,我的系统:Windows XP、4G内存、编程软件DEV_C++5.11,截止点击下面的“参与/回复主题”,我运行了二十分钟,并程序仍在正常运行,看图:

资治通鉴 发表于 2020-10-22 19:31:32

??楼楼啊

资治通鉴 发表于 2020-10-22 19:33:36

楼主,p = malloc(1)
这句话左边的值和右边值,类型不一样呢?
页: [1] 2
查看完整版本: 指针问题