C/C++每日一课 >> [原创]指针易犯错误集(初学者适用)(2005-05-08)

原创 2005年05月14日 17:06:00
/* C/C++每日一课*/
/*2005-05-08*/
/*来自 虚拟现实论坛 (http://www.3d-vr.com)*/
/*作者: srj2005*/

没有什么比混乱的指针带来的麻烦更多了.指针是一个好坏兼有的东西, 他的功能强大, 很多程序都需要他. 同时指针有时也会包含错误的值, 他可以是最难发现的bug.

因为指针错误如同恶梦一般, 所以这里讨论一些常见的指针错误:

1. 指针没有初试化:
/*this program is wrong*/
int main(void)
{
 int x, *p;
 x = 10;
 *p = x;
 return 0;
}
指针p没有赋任何值, 当执行*p = x的时候, 它包含一个未知值, 这使x的值被写到一个未知的内存单元.

2. 赋值写法错误:
/*this program is wrong*/
int main(void)
{
 int x, *p;
 x = 10;
 p = x;
 printf("%d", *p);
return 0;
}
这里原本是想输出x的内容, 结果却没有达到效果, 应该是 p = &x;

3. 错误的比较两个指针:
char s[80], y[80];
char *p1, *p2;
p1 = s;
p2 = y;
if(p1 < p2)...
不要试图通过一个对象的指针来比较对向的内容.

4. 操作越界:
int first[10], second[10];
int *p, t;
p = first;
for(t = 0; t < 20; ++t)*p++ = t;
这段代码在某些编译器下面可能可以正常工作, 但是其实是错误的. first只有10个元素,
但是循环却取到第20个去了, 虽然可能用户是试图给second赋值, 但是c语言并不保证两个数组在内存里面是连续的.

5. 多次循环使用一个指针的时候忘记赋初值:
/*this program is wrong*/
int main(void)
{
 char *p1;
 char s[80];
 p1 = s;
 do{
   gets(s);
   while(*p1) printf("  %d", *p1++);
  }while(strcmp(s, "done"));
 return 0;
}

程序想重复利用缓冲区s来保存每次输入的字符串, 但是没次循环结束后,忘记把p1置回到缓冲开始的位置, 造成很危险的故障.
正确做法:
/*this program is now correct.*/
int main(void)
{
 char *p1;
 char s[80];
 
 do{
   p1 = s;
   gets(s);
   while(*p1) printf("  %d", *p1++);
  }while(strcmp(s, "done"));
 return 0;
}

【每日一课】Python官方文档 5 --- 函数初步

python中利用关键字def引入了一个函数定义。 1.    def function(parameters):     '              ''function descriptio...
  • yajuan090718
  • yajuan090718
  • 2016年06月16日 17:13
  • 113

每日一题---day4

基础题: 1、判断两个链表是否相交,若相交,求交点(假设链表不带环) 思路: 代码: ListNode* Intersect(ListNode* l1,ListNode* l2) {...
  • qq_38117478
  • qq_38117478
  • 2018年01月23日 11:59
  • 12

Java初学者常犯的错误

不含包层次的HelloWorld.javapublic class HelloWorld{ public static void main(String[] args) { System.out.pr...
  • daichanglin
  • daichanglin
  • 2007年03月13日 11:22
  • 551

深入浅出CChart 每日一课——快乐高四第十课 见微知著,CChart内置功能介绍之数据处理篇

CChart内置数据处理功能默认是不打开的。要打开数据处理功能,请点击菜单“绘图状态-->特别功能-->允许数据处理”,这时菜单“曲线数据à数据名”下,将多出一个“数据处理”菜单,如图所示。 可...
  • baita96
  • baita96
  • 2015年08月26日 15:09
  • 1333

一个C/C++程序员最容易犯的错误!

首先让我们看一段代码:void GetCtrlRectViaParent( LPRECT lprc, HWND hwndDlg, UINT idCtrl ){    POINT pt;    HWND...
  • baofeng
  • baofeng
  • 2007年01月20日 12:44
  • 708

C++每日一课(八)

C++算术运算符 C++提供了5种基本的运算符:加、减、乘、除、求模 每种运算符都使用两个值(两个操作数)来计算结果,由运算符加上操作数就构成了表达式 int sum = 100...
  • advent86
  • advent86
  • 2017年06月26日 00:05
  • 114

C++每日一课(十二)

结构体 数组,可以一次性存储多个元素,但是所有的元素都必须是同一种类型。 C++中的结构体则比数组更为灵活,它可以一次性存储多种类型的数据,比如可以把一个学生的信息存储在结构体当中。如果想存储一个...
  • advent86
  • advent86
  • 2017年07月04日 01:25
  • 82

C++每日一课(三)

一、C++语句 /* 作者:xiesheng 时间:2017-06-22 版本:v1.0 说明:C++语句说明 */ #include int main() { using names...
  • advent86
  • advent86
  • 2017年06月23日 01:08
  • 110

C/C++每日一课 >> [原创]typedef 的两种用法

/* C/C++每日一课*/ /*2005-05-14*/ /*来自 虚拟现实论坛 (http://www.3d-vr.com)*/ /*作者: srj2005*/ typedef是c/c++代码中经...
  • sxxny
  • sxxny
  • 2005年05月14日 17:07
  • 1811

C++每日一课(四)

一、函数 使用函数的模块,是用于创建C++程序模块 简单先介绍下函数 函数,分为两种:有返回值、无返回值的 有返回值的函数在执行后会生成一个值,这个值可以用来赋给变量或在其它的表达式中使用。 ...
  • advent86
  • advent86
  • 2017年06月24日 13:19
  • 96
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: C/C++每日一课 >> [原创]指针易犯错误集(初学者适用)(2005-05-08)
举报原因:
原因补充:

(最多只允许输入30个字)