网页设计和网站开发有什么区别,摄影网站设计方案,网页版传奇合击版本,网站后台超链接怎么做常见的 C/C 段错误及对策
一、指针没有指向一块合法的内存
定义了指针变量#xff0c;但是没有为指针分配内存#xff0c;即指针没有指向一块合法的内存。这里举几个比较隐蔽的例子。
结构体成员指针未初始化#xff1b;没有为结构体指针分配足够的内存#xff1b;函数的…常见的 C/C 段错误及对策
一、指针没有指向一块合法的内存
定义了指针变量但是没有为指针分配内存即指针没有指向一块合法的内存。这里举几个比较隐蔽的例子。
结构体成员指针未初始化没有为结构体指针分配足够的内存函数的入口校验一般在函数入口处使用assert(NULL ! p)对参数进行校验。assert 是一个宏而不是函数
三、内存分配成功但并未初始化
memseta,0,sizeof(a);memset 函数有三个参数第一个是要被设置的内存起始地址第二个参数是要被设置的值第三个参数是要被设置的内存大小。
至于指针变量如果未被初始化会导致if 语句或assert 宏校验失败。
四、内存越界
内存分配成功且已经初始化但是操作越过了内存的边界。这种错误经常是由于操作数组或指针时出现“多1”或“少1”。比如
int a[10] {0};
for (i0; i10; i)
{a[i] i;
}所以for 循环的循环变量一定要使用半开半闭的区间而且如果不是特殊情况循环变量尽量从0 开始。
五、内存泄漏
用malloc 函数申请0 字节内存
另外还有一个问题用malloc 函数申请0 字节内存会返回NULL 指针吗
可以测试一下也可以去查找关于malloc 函数的说明文档。申请0 字节内存函数并不返回NULL而是返回一个正常的内存地址。但是你却无法使用这块大小为0 的内存。这好尺子上的某个刻度刻度本身并没有长度只有某两个刻度一起才能量出长度。对于这一点一定要小心因为这时候ifNULL p语句校验将不起作用。
内存释放
malloc 两次只free 一次会内存泄漏malloc 一次free 两次肯定会出错。也就是说在程序中malloc 的使用次数一定要和free 相等否则必有错误。这种错误主要发生在循环使用malloc 函数时往往把malloc 和free 次数弄错了。这里留个 练习
内存释放之后
释放完块内存之后没有把指针置NULL这个指针就成为了“野指针”也有书叫“悬垂指针”。这是很危险的而且也是经常出错的地方。所以一定要记住一条free 完之后一定要给指针置NULL。
六、内存已经被释放了但是继续通过指针来使用
这里一般有三种情况
第一种就是上面所说的freep之后继续通过p 指针来访问内存。解决的办法就是给p 置NULL。
第二种函数返回栈内存。这是初学者最容易犯的错误。比如在函数内部定义了一个数组却用return 语句返回指向该数组的指针。解决的办法就是弄明白栈上变量的生命周期。