鱼C论坛

 找回密码
 立即注册
查看: 2443|回复: 29

[已解决]指针问题

[复制链接]
发表于 2020-10-21 21:58:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为什么这样会向0地址写入东西?
初始化指针的话不都是写成*p=0吗?这时候为什么不是向0地址写入?
最佳答案
2020-10-24 09:18:30
按你所说,将数字改为 10000000,运行后出现如下告警:

系统 DLL user32.dll 在内存中重定位。应用程序将不能正常运行。由于 DLL Dynamically Allocated Memory 占用了为 Windows 系统 DLL 保存的地址空间而产生了错误。应当与提供该 DLL 的供应商联系以得到新的DLL。

"Dx00401044"指令引用的"Ox0000000"内存。该内存不能为"written".
要终止程序,请单击“确定”
要调试程序,请单击“取消”。

点第一条告警,弹出第二条告警,所以,答案 A 是不正确的 (占用了为 Windows 系统 DLL 保存的地址空间而产生了错误,而不是没有了空间),答案 C 、D也是不正确的,故此题非要选一个答案,就只能选 B 了,尽管是因为占用地址出错而退出,而并非向 0 地址写入而退出
QQ截图20201021215251.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-21 22:02:52 | 显示全部楼层
死循环,每执行一次,就会动态申请一次空间,所以最终会因为没有空间而报错
*p=0,是给分配的空间进行赋值,不是向0地址写入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不好意思,我截图没截全,这题答案是B
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

而且我试了试,不知道为啥程序不会退出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-21 22:48:12 | 显示全部楼层
不是选D么,malloc返回的是不是void *的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-21 23:04:10 | 显示全部楼层
.
QQ截图20201021230310.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-10-21 23:09:10 | 显示全部楼层
塔利班 发表于 2020-10-21 22:48
不是选D么,malloc返回的是不是void *的

我用的dev-c++编译可以过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-21 23:17:43 | 显示全部楼层
马老师 发表于 2020-10-21 23:09
我用的dev-c++编译可以过

朋友,能不能将全部的代码发出来,我们试着运行一下,也好学习研究一下,好吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-22 10:17:17 | 显示全部楼层
我用的gcc调试  首先,void* 赋值给 char*编译报错无法运行,然后加上强制类型转换之后,直接运行到死机,我可以很负责任的告诉你  程序并没有退出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-22 10:52:39 | 显示全部楼层
支持 2 楼大佬 说的,死循环,最后会因为没有空间报错或直接死掉,*p = 0是写入数据 0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-22 11:36:44 | 显示全部楼层
楼主啊,这道题选D
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-22 11:37:57 | 显示全部楼层
应该不存在分配不了地址的问题吧,操作系统会有保护的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

有的 malloc 分配失败会返回 NULL,导致0地址写入

评分

参与人数 1鱼币 +8 收起 理由
sunrise085 + 8 这个正解

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-10-22 12:52:14 | 显示全部楼层
塔利班 发表于 2020-10-21 22:48
不是选D么,malloc返回的是不是void *的

有的编译器支持这种隐式转换
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我把后边的1改成了很大的数,等个一两秒程序就结束了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-22 18:35:18 | 显示全部楼层
资治通鉴 发表于 2020-10-22 11:36
楼主啊,这道题选D

编译通过了,后面的数变的很大时,他会退出程序。
然后我把*p=0去掉之后,程序也不会退出了,会一直运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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,截止点击下面的“参与/回复主题”,我运行了二十分钟,并程序仍在正常运行,看图:

循环.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-22 19:31:32 | 显示全部楼层
??楼楼啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-22 19:33:36 | 显示全部楼层
楼主,p = malloc(1)
这句话左边的值和右边值,类型不一样呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 19:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表