user-0 提问: 对指针进行解引用的错误

回复:
user: user-0
content: 引用 19 楼 angel_su 的回复:换个低版本vc试试... 恩，用VS2012 没有出这个警告 对编译器完全不懂啊， VS2012 和 VS2013 编译器的变化还挺大？

user: user-1
content: 换个低版本vc试试...

user: user-0
content: 顶起来！！！！

user: user-2
content: 引用 20 楼 dong50059 的回复:[quote=引用 19 楼 angel_su 的回复:] 换个低版本vc试试... 恩，用VS2012 没有出这个警告 对编译器完全不懂啊， VS2012 和 VS2013 编译器的变化还挺大？[/quote] 变化不大，基本上没什么变化，只是占用资源更大了。

user: user-0
content: 有懂编译的人能给讲解下吗？

user: user-3
content: 这样说吧，根据你的函数内容，就算你写成 PB pt = pa->pb +i，并且编译通过了，执行时也会出问题，只有i=0的时候是正确的  编译有没有警告是 编译器给你搞得，c语言规定-> 跟[]的优先级是相同的，支持从左到右的结合性 &pa->pb[i] ==== &(pa->pb[i]) ==== &((pa->pb)+i),你看看 成什么了，是一个指针的指针，跟pa->pb+i对等吗？ 根据你的想发 pa->pb[i]本身就是指针，你取了&，跟PB pt不对等啊，编译器肯定要报错 并且你这种用法本身就是错误的，你应该写成 PB pt = (pa+i)->pb,不信你试试

user: user-0
content: 引用 3 楼 user-4 的回复: for (i = 0; i < 10; i++)  {    PB pt = &pa->pb[i]; //再看看这里能不能达到你的目的吧！     pt->type = 0x00; }   我是想在 pa->pb 这个指针所指向的内存上进行赋值运算等，而不是想在 pa 所指向的内存上运算， 这样写应该没有问题吧？ 用指针的加法来移动指针的话 （PB pt = (pa+i)->pb） ， 却没有警告， 换成数组形式的话，警告就出来了，它们本质上不是 一致的吗？ 有什么区别呢， 我的基础不太好，可能有不知道的地方，请指教

user: user-0
content: 引用 5 楼 u012232386 的回复:[quote=引用 3 楼 user-4 的回复:]  for (i = 0; i < 10; i++)  {    PB pt = &pa->pb[i]; //再看看这里能不能达到你的目的吧！     pt->type = 0x00; }  正解，楼主 你应该写成： PB pt = (pa+i)->pb吧 至于你说的语法相通....看看运算符优先级吧[/quote]   PB pt = &pa->pb[i]; 和 PB pt = pa->pb +i ; 是相等的吧？  而PB pt = &pa->pb[i]; 和 PB pt = (pa+i)->pb 是不相等的， 我是这样认为的，如果有不对的地方，请指正

user: user-3
content: 引用 3 楼 user-4 的回复: for (i = 0; i < 10; i++)  {    PB pt = &pa->pb[i]; //再看看这里能不能达到你的目的吧！     pt->type = 0x00; }  正解，楼主 你应该写成： PB pt = (pa+i)->pb吧 至于你说的语法相通....看看运算符优先级吧

user: user-0
content: 我很想知道原因是为什么，语法上相同，为什么编译结果去不同

user: user-0
content: 引用 15 楼 angel_su 的回复:说说用啥编译器，既然你对此有意见... 哈哈，我没啥意见，就是发现个问题想搞清楚而已 我是用 VS2013 编译的

user: user-0
content: 引用 2 楼 worldy 的回复:pa->pb[i];和pa->pb+i;等价 但是和&pa->pb[i] 就不等价了 pa->pb[i];和pa->pb+i;不等价，应该是 pa->pb[i];和*(pa->pb+i);等价才对？

user: user-1
content: 说说用啥编译器，既然你对此有意见...

user: user-2
content: 引用 2 楼 worldy 的回复:pa->pb[i];和pa->pb+i;等价 但是和&pa->pb[i] 就不等价了 同意，这绝对不是等价的

user: user-0
content: 没有人能给出解释吗？

user: user-3
content: 引用 11 楼 dong50059 的回复:[quote=引用 10 楼 u012232386 的回复:] [quote=引用 9 楼 dong50059 的回复:] [quote=引用 8 楼 u012232386 的回复:] 这样说吧，根据你的函数内容，就算你写成 PB pt = pa->pb +i，并且编译通过了，执行时也会出问题，只有i=0的时候是正确的  编译有没有警告是 编译器给你搞得，c语言规定-> 跟[]的优先级是相同的，支持从左到右的结合性 &pa->pb[i] ==== &(pa->pb[i]) ==== &((pa->pb)+i),你看看 成什么了，是一个指针的指针，跟pa->pb+i对等吗？ 根据你的想发 pa->pb[i]本身就是指针，你取了&，跟PB pt不对等啊，编译器肯定要报错 并且你这种用法本身就是错误的，你应该写成 PB pt = (pa+i)->pb,不信你试试  &pa->pb[i] ==== &(pa->pb[i]) 是正确的，&(pa->pb[i]) ==== &((pa->pb)+i)是不对的， 应该是&(pa->pb[i]) ==== &(*((pa->pb)+i)) 吧？[/quote]  嗯，应该是你写的，我给漏了，不好意思[/quote] 这样的话，PB pt = &pa->pb[i];  =====  PB pt = pa->pb +i ; 是正确的， 但分别使用它们两个，编译结果是不同的，不是很奇怪吗[/quote]  我也不知道为什么一个报一个不报，编译器给搞的，但是有一点： pa = (PA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 10 * sizeof(A));  if (pa == NULL){  return -1; } pa->pb = (PB)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);  if (pa->pb == NULL) {  return -1; } 你确定10个pa， 1个pb? 不是1个pa, 10个pb?  有个词 叫 越界！！

user: user-0
content: 引用 10 楼 u012232386 的回复:[quote=引用 9 楼 dong50059 的回复:] [quote=引用 8 楼 u012232386 的回复:] 这样说吧，根据你的函数内容，就算你写成 PB pt = pa->pb +i，并且编译通过了，执行时也会出问题，只有i=0的时候是正确的  编译有没有警告是 编译器给你搞得，c语言规定-> 跟[]的优先级是相同的，支持从左到右的结合性 &pa->pb[i] ==== &(pa->pb[i]) ==== &((pa->pb)+i),你看看 成什么了，是一个指针的指针，跟pa->pb+i对等吗？ 根据你的想发 pa->pb[i]本身就是指针，你取了&，跟PB pt不对等啊，编译器肯定要报错 并且你这种用法本身就是错误的，你应该写成 PB pt = (pa+i)->pb,不信你试试  &pa->pb[i] ==== &(pa->pb[i]) 是正确的，&(pa->pb[i]) ==== &((pa->pb)+i)是不对的， 应该是&(pa->pb[i]) ==== &(*((pa->pb)+i)) 吧？[/quote]  嗯，应该是你写的，我给漏了，不好意思[/quote] 这样的话，PB pt = &pa->pb[i];  =====  PB pt = pa->pb +i ; 是正确的， 但分别使用它们两个，编译结果是不同的，不是很奇怪吗

user: user-3
content: 引用 9 楼 dong50059 的回复:[quote=引用 8 楼 u012232386 的回复:] 这样说吧，根据你的函数内容，就算你写成 PB pt = pa->pb +i，并且编译通过了，执行时也会出问题，只有i=0的时候是正确的  编译有没有警告是 编译器给你搞得，c语言规定-> 跟[]的优先级是相同的，支持从左到右的结合性 &pa->pb[i] ==== &(pa->pb[i]) ==== &((pa->pb)+i),你看看 成什么了，是一个指针的指针，跟pa->pb+i对等吗？ 根据你的想发 pa->pb[i]本身就是指针，你取了&，跟PB pt不对等啊，编译器肯定要报错 并且你这种用法本身就是错误的，你应该写成 PB pt = (pa+i)->pb,不信你试试  &pa->pb[i] ==== &(pa->pb[i]) 是正确的，&(pa->pb[i]) ==== &((pa->pb)+i)是不对的， 应该是&(pa->pb[i]) ==== &(*((pa->pb)+i)) 吧？[/quote]  嗯，应该是你写的，我给漏了，不好意思

user: user-0
content: 引用 8 楼 u012232386 的回复:这样说吧，根据你的函数内容，就算你写成 PB pt = pa->pb +i，并且编译通过了，执行时也会出问题，只有i=0的时候是正确的  编译有没有警告是 编译器给你搞得，c语言规定-> 跟[]的优先级是相同的，支持从左到右的结合性 &pa->pb[i] ==== &(pa->pb[i]) ==== &((pa->pb)+i),你看看 成什么了，是一个指针的指针，跟pa->pb+i对等吗？ 根据你的想发 pa->pb[i]本身就是指针，你取了&，跟PB pt不对等啊，编译器肯定要报错 并且你这种用法本身就是错误的，你应该写成 PB pt = (pa+i)->pb,不信你试试  &pa->pb[i] ==== &(pa->pb[i]) 是正确的，&(pa->pb[i]) ==== &((pa->pb)+i)是不对的， 应该是&(pa->pb[i]) ==== &(*((pa->pb)+i)) 吧？

user: user-4
content: for (i = 0; i < 10; i++)  {    PB pt = &pa->pb[i]; //再看看这里能不能达到你的目的吧！     pt->type = 0x00; }