user-0 提问: 谁能发现下面程序错误，怎么改？

回复:
user: user-0
content: paschen  和vcgaoshou 正解，高手真多，膜拜一下！

user: user-1
content: int main() { 	wchar_t texts[2][25][80]; 	wchar_t (*p_old)[25][80] = &texts[0]; 	wchar_t (*p_new)[25][80] = &texts[1]; 	wchar_t (*tmp)[80]  = &p_new[24][0];   	if (memcmp(tmp,p_new[24],sizeof(wchar_t)*80) == 0) 	{ 		//do something  	}  	return 0; }

user: user-1
content: 或者   int main() { 	wchar_t texts[2][25][80]; 	wchar_t (*p_old)[25][80] = &texts[0]; 	wchar_t (*p_new)[25][80] = &texts[1]; 	wchar_t (*tmp)[80]  = &(*p_new)[24];   	if (memcmp(tmp,(*p_new)[24],sizeof(wchar_t)*80) == 0) 	{ 		//do something  	}  	return 0; }

user: user-2
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-3
content: 由定义wchar_t texts[2][25][80];可知，texts数组只有2个元素，分别是texts[0],texts[1], wchar_t (*p_new)[25][80] = &texts[1];表明p_new指向了texts的第二个元素texts[1]。  (*tmp)[80]表示tmp是一个行指针，指向有80个元素的一维数组。 现在wchar_t tmp=p_new[24];即 wchar_t tmp=*(p_new+24)，表示tmp指向texts数组的第26个元素texts[25 ] 而texts[2][25][80]只有2个元素texts[0],texts[1]，所以无法通过tmp指针访问到texts的区域。

user: user-4
content: 1   #include <stdio.h>                                                                                                                                                                                          1 #include <stdlib.h>                                                  2 #include <memory.h>                                                  3             4 //typedef short wchar_t;                                             5             6 int main(void)                                                       7 {           8     wchar_t texts[2][25][80] = {    //the length of array is 2       9     |   { //the length of the array is 25                           10     |   |   {'h', 'o'},    //The length of the array is 80          11     |   |   {'w', 'o'},                                             12     |   |   {'b', 'e'},                                             13     |   |   {'b', 'e'},                                             14     |   |   {'b', 'e'},                                             15     |   |   {'b', 'e'},                                             16     |   |   {'b', 'e'},                                             17     |   |   {'b', 'e'},                                             18     |   |   {'b', 'e'},                                             19     |   |   {'b', 'e'},                                             20     |   |   {'b', 'e'},                                             21     |   |   {'b', 'e'},                                             22     |   },                                                          23     |   {                                                           24     |   |   {'h', 'o'},                                             25     |   |   {'w', 'o'},                                             26     |   |   {'b', 'e'}                                              27     |   }                                                           28     };  >> 29     wchar_t (*p_old)[25][80] = &texts[0];                           30     wchar_t (*p_new)[25][80] = &texts[1];    //or texts+1           31     wchar_t (*tmp)[80]  = p_new[0];    //tmp is two dimensional array, or wchar_t (*tmp)[80] = p_new[1];    32     //wchar_t (*tmp)[80]  = p_new[24];   //p_new is out of bounds    33            34     if (memcmp(tmp,p_new[24],sizeof(wchar_t)*80) == 0)    35     {      36     | //do something                                                37     }      38            39     return 0;                                                       40 }   个人理解，tmp是一个二维数组，只是比普通二维数组特殊一点，其行数是80，所以，p_new[24]赋值tmp是越界的，只能是p_new[0]或者p_new[1]赋值给tmp

user: user-5
content: wchar_t texts[2][25][80];   wchar_t (*p_old[25])[80];    wchar_t (*p_new[25])[80];    p_new[24] = &texts[1][24];   wchar_t (*tmp)[80] = p_new[24];

user: user-5
content: 第一次的回答错了，跟初始化没有关系，而是指针类型错误，导致了访问越界 确实不太容易发现

user: user-6
content: 没有初始化吗？没用过wchar哎，，，

user: user-5
content: wchar_t texts[2][25][80] = {0};