int a[10] { 1,2,3,4,5,6,7,8,9,10 }; int* ptr = &(a[4]); unsigned int idx; idx = -2; CString str; str.Format(_T("%d"),ptr[idx]); AfxMessageBox(str);为什么可以在32位正常运行,而64位不能正常运行
时间: 2024-04-11 09:32:02 浏览: 90
在32位系统中,指针和unsigned int都是32位的数据类型,所以在这种情况下,代码可以正常运行。
然而,在64位系统中,指针和unsigned int都是64位的数据类型。在给定的代码中,将-2赋值给unsigned int类型的变量idx。在64位系统中,负数会被转换为一个很大的正数,超出了数组a的范围。
因此,在64位系统中,ptr[idx]将访问数组a之外的内存位置,这是未定义行为,可能导致程序崩溃或产生错误的结果。
为了编写可移植和安全的代码,应该遵循正确的指针和数组访问规则,并确保不超出数组的有效范围。在使用指针和数组时,应该根据数据类型选择适当的索引类型(例如使用ptrdiff_t)来确保代码在不同位数的系统上都能正常运行。
阅读全文