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

王朝c/c++·作者佚名  2006-01-09
宽屏版  字体: |||超大  

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

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有