本着着数据结构是王道的原则,狠下心来闭门修炼,刚着手约瑟夫循环的时候就遇见一点指针方面的理解障碍,看来功力确实不足。简单抽象出来的代码如下:
编译没问题,运行就崩溃。本来觉得数组跟指针既然没多大区别,那定义了*a,自然就可以用a[i]来引用。尝试把*a换成a[256],运行,没问题。问题锁定在*a的定义上面。半天没想法,问了下呵呵,他说*a定义时并没有给后面的内存分配空间,而a[256]就明确指定了空间大小。一句话醍醐灌顶,内存不够了。想了一下,觉得定义a[]和*a直观上感觉是一样的效果,事实也确实如此,而*a却能逃过编译器的眼睛,a[]就成了bug。
问题虽小,思想原创。想了一下内存泄漏,内存溢出跟指针悬垂的问题,都是关于内存空间分配与使用的问题,而这些问题往往不像逻辑错误能够简单识别,只能再摸索中前进。
关于指针,最近在如鹏上看到一篇文章,确实短小精悍,值得思考一下:
简单想了一下,自然觉得输出2 1,粘下来运行,傻了,5 2。看了解释后才明白,&a与a值是一样的,都是存放a[0]的地址,而代表的意义不同,&a指向一维数组的地址,即整个a这这片内存,故ptr = &a+1即为横向指针加1,指向a[4]后面一个地址,其实也就是二维数组中的行指针。这段代码似乎没有一点二维数组的影子,而真正重点在于行指针。如果将(int*)(&a+1)改为a+1,输出结果就变成了2 1。
觉得有点意思。