
以前曾听高手和很多书籍谈到指针连同为此带来的方便和烦恼。。 这次,我在写一个将数据记录到文档的小程式时没想到也会碰到野指针。程式如下: #include #include #include #include #include #include #include main() { int fd; FILE *fd_stream; char buff=’ ’,*pp,*qq; int ss,i,j; char* getASCII(short param); if((fd=open("bb.txt",O_WRONLY|O_CREAT|O_TRUNC,S_IRWXU))==-1) { printf("open() error\n"); exit(1); } for(j=0;j<10;j++) { pp=getASCII(3845); //printf("\nqq:%8d\n",qq); for(i=0;i { printf("%c",*(pp+i)); write(fd,(pp+i),1); } for(;i<20;i++) { write(fd,&buff,1); printf(" "); } printf("a\n"); } i=0; qq=getASCII(9876); //printf("\nqq:%8d\n",qq); for(i=0;i { printf("%c",*(qq+i)); write(fd,(qq+i),1); } for(;i<20;i++) { write(fd,&buff,1); printf(" "); } printf("a\n"); } char* getASCII(short param) { int temp; char* result; int ratio=10000,i; result=calloc(10,1);//allocate 10 continuous unit,1 Byte per unit---------------------------任何的奥妙就在这一句,假如不给这个指针赋值,那他就是个野指针。 for(i=0;i<5;i++) { temp=param/(ratio/(int)pow(10,i)); param=param-temp*(ratio/(int)pow(10,i)); *(result+i)=temp+’0’; } for(i=0;i<5;i++) printf("%c",*(result+i)); printf("\nresult:%8d",result); return result; } 能够测试一下,假如没有上面calloc()一句,那么,结果就是这样的。 result:1074058344 03845
03845 result:-1073748620 0??? 03845 result:-1073748620 0??? 能够看到,野指针的危害,在getASCII()函数内,结果还是对的,也就是说,虽然这时,指针位置不可预料,但是,不论指到哪,这个指针的操作还是正确的。问题在于,由于野指针在内存中是没有“注册的”,所以,他所占据的内存,随时可能被占用,所以,当退出函数后,指针所指向的内存区域的内容就有变化,这就是为什么就第一次循环结果不论是函数内还是main()里都正确的原因。
|