指针错误出现的是烫而不是其它

licong900527 2010-10-23 08:31:42
在写程序的时候经常会因为背景针的出错而打印出很多“烫”,这个是什么原因造成的,为什么出现的是“烫”而不是其它的字符?
...全文
190 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
licong900527 2010-10-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wjb_yd 的回复:]

汗,楼上的都在瞎说。
首先lz肯定用的vc编译器,而vc在debug模式下编译出来的代码中,每次进入函数,都会有这么几句汇编代码:
Assembly code

lea edi,[ebp-0E0h] // ebp-0E0h是可变的
mov ecx,38h // 38h是可变的
mov eax,0CCCCCCCCh……
[/Quote]

了解了,多谢指点!
-迷糊- 2010-10-26
  • 打赏
  • 举报
回复
怎么一看到“烫”就有点恶心呢。。
mstlq 2010-10-26
  • 打赏
  • 举报
回复
7楼说的对

debug版初始化成0xcc是因为0xcc在x86下是一条int 3单步中断指令,这样程序如果跑飞了遇到0xcc就会停下来,这和单片机编程时一般将没用的代码空间填入jmp 0000语句是一样地
Ionstorm2 2010-10-26
  • 打赏
  • 举报
回复
7L高手啊
wjb_yd 2010-10-26
  • 打赏
  • 举报
回复
汗,楼上的都在瞎说。
首先lz肯定用的vc编译器,而vc在debug模式下编译出来的代码中,每次进入函数,都会有这么几句汇编代码:

lea edi,[ebp-0E0h] // ebp-0E0h是可变的
mov ecx,38h // 38h是可变的
mov eax,0CCCCCCCCh
rep stos dword ptr es:[edi]

这4行汇编码的作用就是将函数栈的空间全部用0xcc填充,目的就是将0xcc作为栈空间里未初始化值的标志。所以你会看到栈上所有没初始化的变量,值都是由n个0xcc组成的。而且这个可以用来检查栈上是否有写越界。

而ansi编码下,两个0xcc就是中文字符“烫”。
licong900527 2010-10-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ayw215 的回复:]

以上代码在VC环境下调试运行。
step1. 运行完语句Node *pNode=NULL;后:
Name Value
+ &p 0x0012ff7c ""
+ &q 0x0012ff78 ""
+ &d 0x0012ff74 ""
+ &pNode 0x0012ff70 ""
Memory:
0012FF66 CC CC CC CC CC CC CC CC CC CC 00 烫烫烫烫烫.
0012FF71 00 00 00 CC CC CC CC 00 00 00 00 ...烫烫....
0012FF7C 00 00 00 00 C0 FF 12 00 39 11 40 ........9.@

[/Quote]

这里为什么会是这样的一个值?
licong900527 2010-10-23
  • 打赏
  • 举报
回复
我知道这个很多情况是因为指针未初始化造成的这种情况,但是不知道为什么他出现的是“烫”而不是其它字符,比如说它为什么在初始化的时候要将指针指向的内存区初始化为0xcd
小魔菇 2010-10-23
  • 打赏
  • 举报
回复
首先是乱码
然后是字符集设置的原因
ayw215 2010-10-23
  • 打赏
  • 举报
回复
#include <stdio.h>

struct Node
{
int a;
char b[10];
Node *next;
};

main(void)
{
char *p=NULL; //"define NULL 0" included in <stdio.h>
int *q=0; //值0是唯一能够直接赋给指针变量的整数值
double *d;

Node *pNode=NULL;

d=NULL;

return 0;
}

以上代码在VC环境下调试运行。
step1. 运行完语句Node *pNode=NULL;后:
Name Value
+ &p 0x0012ff7c ""
+ &q 0x0012ff78 ""
+ &d 0x0012ff74 ""
+ &pNode 0x0012ff70 ""
Memory:
0012FF66 CC CC CC CC CC CC CC CC CC CC 00 烫烫烫烫烫.
0012FF71 00 00 00 CC CC CC CC 00 00 00 00 ...烫烫....
0012FF7C 00 00 00 00 C0 FF 12 00 39 11 40 ........9.@

step2. 运行完语句d=NULL;后:
Name Value
+ &p 0x0012ff7c ""
+ &q 0x0012ff78 ""
+ &d 0x0012ff74 ""
+ &pNode 0x0012ff70 ""
Memory:
0012FF66 CC CC CC CC CC CC CC CC CC CC 00 烫烫烫烫烫.
0012FF71 00 00 00 00 00 00 00 00 00 00 00 ...烫烫....
0012FF7C 00 00 00 00 C0 FF 12 00 39 11 40 ........9.@

在Turbo C中的代码如下:
#include <stdio.h>

struct Node
{
int a;
char b[10];
struct Node *next;
};

main(void)
{
char *p=NULL;
int *q=0;
double *d;

struct Node *pNode=NULL;

d=NULL;

return 0;
}

注意:
1. 可以把指针初始化为0、NULL或某个地址,具有值NULL的指针不指向任何值。
2. 当把0赋值给指针时,编译器先把0转换为指向合适数据类型的指针。
3. 值0是唯一能够直接赋给指针变量的整数值
4. 切忌使用未初始化的指针会给系统带来隐藏的危害,一但指针指向非法区域,会造成系统崩溃。

5、就像你所说的 提高了安全性
c就不会自动初始化 所以在未初始化的情况下 操作会得到意想不到的结果

比如指针变量没有初始化 那它里面的值是任意的 也就是它指向的地址是任意的

这样子 有可能访问到系统的内存 这时再进行操作 系统也就挂了

都初始化为0,起码不会出太大问题吧,最多就是结果不对
知识要点:
1、char *pstr;
这么写仅仅是声明了一个指针,由于它没有指向任何地址,所以并不存在指针变量里的值,
此时,pstr=NULL;这种写法仅仅是将指针初始化,将其作为空指针,
一般为了防止进行未初始化的指针被使用出现野指针,所以会这么写。
如果要将一块地址空间(也就是针变量里的值置零)进行初始化,一般这么写:
char pstr[20]={NULL};//初始化时这么写
或者是
memset(pstr,NULL,sizeof(pstr));//代码中这么写
2、指针变量的初始化?
int *p,a;
p=&a;//这样可以,但是要在定义的时候就初始化怎么办?
可以指向空,也可以指向某个变量地址啊
定义时 int *p=NULL;或者int *p=&a; 或者int *p=0;
3、int *q=0; //值0是唯一能够直接赋给指针变量的整数值-------------->分析
初始化指针变量q,有两个作用,首先会在当前系统堆栈区给q开辟一个随机地址&q,同时将*q(指针q所指向的空间的内容)的值修改为0。关于书上说的“野指针的危害性”,通过初始化指针来解决,主要体现在,当我们初始化指针变量q时,会给q一个随机地址&q(该值是随机的堆栈空间地址,不确定),当程序访问到指针变量q时,就不会出现由于没有事先初始化指针变量q,而导致的&q指向危险区域的情况发生。
lovesi3344 2010-10-23
  • 打赏
  • 举报
回复
越界了就出现烫

因为是台湾先汉化的 所以是烫
cxxer 2010-10-23
  • 打赏
  • 举报
回复
乱码,输出的是野指针所指对象。

65,168

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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