对指向NULL的指针操作会出现什么问题?

nes-c 2014-10-27 11:45:05
本人在ecosystem系统下做开发,涉及到一个问题:
如下操作:char * string = NULL;
printf("%p ---\n",string);
printf("---%d---\n",*string);
当调用上述代码时会第一个打印为0x0,指向NULL即指向0地址。
第二句操作理论上应该是会出现问题,问题如下所述,该句操作换成其他的对string的赋值以及对比或者++,--操作也会出现同样的问题。
当我的程序跑到第二句时程序不是立即卡死,会直接开通我的串口,然后我通过电脑对串口发送数据,它会直接发送回来到我的电脑上,即该处代码会自动接收串口数据并返回到串口发出,然后一会就程序自动重启。
请各位稍加分析,鄙人不甚感激,我主要就是来调通串口的,可是一直发送接收出现错码误码漏码的情况,此时调通了可是却跟我代码无关。
...全文
709 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
nes-c 2014-12-05
  • 打赏
  • 举报
回复
没有对空地址的操作,也就是没有第二句串口不通。 但是与串口的读写接口可以读写串口,只是数据不稳定,会出现滤掉很多数
nes-c 2014-12-05
  • 打赏
  • 举报
回复
没有对空地址的操作,也就是没有第二句串口不通。 但是与串口的读写接口可以读写串口,只是数据不稳定,会出现滤掉很多数
nes-c 2014-12-05
  • 打赏
  • 举报
回复
没有对空地址的操作,也就是没有第二句串口不通。 但是与串口的读写接口可以读写串口,只是数据不稳定,会出现滤掉很多数
ben4058512 2014-11-26
  • 打赏
  • 举报
回复
第二句导致你串口发送数据的情况,有可能的情况是,你的系统的标准的output就是你的串口,这时候,printf的信息都会从你的串口发送出去(嵌入式系统中经常把uart0作为它的标准输入输出和标准出错终端)。
buyong 2014-11-26
  • 打赏
  • 举报
回复
这种测试没意义,代码本身就是不安全的
jasion_chen 2014-11-01
  • 打赏
  • 举报
回复
是你的串口的回显吧,第二句的访问肯定是错误的,可能不同的编译器处理起来会不一样
竹影半墙 2014-11-01
  • 打赏
  • 举报
回复
参考: 《Linux C一站式=编程》:NULL在C标准的头文件stddef.h中定义:#define NULL ((void *))。就是把地址0转换成指针类型,称为空指针,它的特殊之处在于,操作系统不会把任何数据保存在地址0及其附近。也不会把地址0 ~ 0xffff的页面映射到物理内存,所以任何对地址0 的访问都会导致段错误。 《TCPL》:0常被用作地址无效的标志。NULL被定义在stdio.h中,值为0。 《C陷阱与缺陷》:NULL表示内存位置0,NULL指针并不指向任何对象。因此除非是用于赋值或比较运算,出于其他任何目的使用NULL指针都是非法的。引用NULL内存内容依编译器的不同而不同。某些C语言实现堆内存位置0强加了硬件级的读保护,在其上工作的程序如果错误使用了NULL指针,将立即终止执行。其他一些C语言实现堆内存位置0只允许读,不允许写。在这种情况下,一个NULL指针似乎指向的是某个字符串,但其内容通常不过是一堆“垃圾信息”。还有些C语言实现对内存位置0既允许读也允许写。在这种实现上面工作的程序如果错误使用了一个NULL指针,则很可能覆盖了操作系统的部分内容,造成彻底的灾难! 《C和指针》:标准定义了NULL指针,它作为特殊的指针变量,表示不指向任何东西。之所以选择0这个值是因为一种源代码约定,就机器而言,NULL指针的实际值可能与此不同,在这种情况下,编译器将负责0值和内部值之间的翻译转换。NULL指针十分有用,因为他给了程序员一种方法,表示某个特定的指针目前并未指向任何东西。 ......
zhxianbin 2014-10-31
  • 打赏
  • 举报
回复
没有第二句时,你通过电脑对串口发送数据,就不会回到你的电脑上吗? 这种错误用法也许没有固定结果
nes-c 2014-10-31
  • 打赏
  • 举报
回复
为什么没有一个人提供点点线索,,, 难道这只是一个诡异的问题。

18,777

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧