c编程常见错误-指针乱走

指针是c语言的一大特色、通过指针可以方便灵活的对内存数据进行操作。
越是强大、好用的东西越是容易出错,昨天午夜十分通过对一段程序的跟踪,解决掉了一个大臭虫,该臭虫出现的原因就是指针乱走。
通常我们在使用指针对一段内存进行操作时候,常常遇到需要递加指针来遍历内存的情况。这种情况下到底一次指针递加操作因该递加多少的问题就非常重要了。
比如有一下两个指针定义:

struct node *pnode;
char *pchar;

那么一下几个问题出现:

pchar++; 和pnode++;在内存中走的比特数是一样的吗?

pchar++,每操作一次递加的是一个char的长度,也就是说以char为单位递加的。
而pnode++,每操作一次递加的是一个struct node的长度,是以struct node为单位递加的。
而char 和 struct node的长度 如果不同,那么走的比特数就是不一样的。

从pnode到下一个node是应该pnode+sizeof(struct node)还是 pnode++呢?

从上个问题已经弄清楚 pnode +1 实际上就是走了一个node,如果+了sizeof(struct node),就走了sizeof(struct node )个node,因此将pnode指向下一个node应该是pnode++。

以上两个问题如果没有考虑清楚,绝对不要随便继续下去,因为很可能接下来的操作马上用到pnode内的成员变量,而此时如果pnode的递加是错误的,那么pnode就被指到了错误的地址,那么接下来是一定会出错的,而且这种错误是非常不便于调试改正的,因为由于进行操作的地址变了,而具体那块地址中到底是什么数据又是不确定的,那么所导致的错误类型、错误的具体地方可能都是不确定的。
指针操作当慎重、谨防乱走。

Post a Comment

Your email is never shared. Required fields are marked *

*
*