/* 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; }
|