切记要初始化指针
Posted notfound
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了切记要初始化指针相关的知识,希望对你有一定的参考价值。
今天,在写顺序栈时,开始形参传递的是通过取地址,就是用 SeqStack &S 传递,后来看到网上有用指针来传递的,于是想来改成用指针传递。
问题来了,当我把所有的 S.top S.data 修改为 S->top S->data 、SeqStack &S 修改为 SeqStack *S 运行时,用的是 codeblocks ,运行并未报错,可是不打印出栈中元素,运行一会就返回 Process returned -1073741819 (0xC0000005) 错误退出。为了找到具体报错位置,我挨个加了 printf() 发现了问题所在,就是只要运行到有 S->top 或 S->data 就异常退出。因为栈要初始化,所以执行到 InitStack(SeqStack *S) 下的 S->top = -1 时就异常退出。
什么问题呢?于是我按照我的写法简单写了个测试程序。
#include <stdio.h>
typedef int DataType;
typedef struct
{
DataType data;
int top;
}SeqStack;
int main()
{
SeqStack *S;
// 去掉注释程序就正常运行 输出 100 1
// SeqStack address;
// S = &address;
S->data= 100;
S->top = 1;
printf("%d %d ", S->data, S->top);
}
问题就在有没有给定义的指针初始化。那要怎么去判断有指针没有初始化呢?
下面是笔者的想法,在 codeblocks 运行时退出返回的是 Process returned -1073741819 (0xC0000005), 那么其它的呢,于是又写了个程序来测试.
#include <stdio.h>
int main()
{
int *a, b;
//b = 100;
//a = &b;
printf("%d", *a);
}
运行后,同样是返回错误 Process returned -1073741819 (0xC0000005),那么会不会有野指针时,都是会有这错误呀。笔者百度了一下,发现这个错误跟内存有关,那么野指针不就是指向一个已删除的对象或未申请访问受限内存区域。
所以这个报错就是与内存相关,所以出现此错误时,不妨去检查与内存相关的语句吧。
当然,重要是一个好的编程习惯!!! 定义指针时一定要初始化,野指针的缺省值是随机,它会乱指一通,不管地址是否合法,因此这样对野指针进行操作很容易造成程序错误!!
以上是关于切记要初始化指针的主要内容,如果未能解决你的问题,请参考以下文章