【问题标题】:pointer arithmetic on elements and beyond. what is wrong with this code?元素及其他元素的指针算术。这段代码有什么问题?
【发布时间】:2013-11-12 11:46:33
【问题描述】:

请问,这段代码有什么问题。它应该打印到 y[4] 然后退出 while 循环,但它打印到 y[12] 并从那里中断;我认为在 y[5] 到 y[12] 之间打印是错误的。以一个网站为例,指针运算仅限于数组元素和一个元素之外的元素。

#include <stdio.h>

int main()
{
   int i = 0;
   int x[5] = {0, 1, 2, 3, 4};
   int y[5];
   int *ptr = x;
   while (&y[i] != (ptr+5)){
        y[i] = x[i];
        printf("Value of y[%d] is : %d\n", i, y[i]);
        i++;
   }

   return 0 ;
}

【问题讨论】:

  • (检查一下,但我几乎可以肯定,不能保证 y 会在 x 之后立即分配)
  • 你宁愿想要while (&amp;x[i] != ptr + 5)
  • 我相信你的说法是正确的,H2CO3。 y[i] 已声明但未初始化。我才意识到。在一个网站上找到它。谢谢

标签: c pointers


【解决方案1】:

您的条件(&amp;y[i] != (ptr+5) 是错误的。 Y 是一个数组,它指向与 x 完全不同的内存区域。所以条件将保持真实。

【讨论】:

    【解决方案2】:

    条件&amp;y[i] != (ptr+5) 在这里没有意义。为什么要比较 yptr?它们指向不同的内存位置。它们永远不会相同,因为它们指向两个不同的位置。你只需要检查一下:

    while (i<5)
    

    查看完整代码here

    【讨论】:

    • 我认为while控制流的本质是表明一个指针可以指向其数组之外的一个元素;所以数组应该在while中。
    【解决方案3】:

    无法保证数组y 将放置在相对于数组x 的特定位置。所以你正在利用的是编译器特定的行为,它可能会根据使用的编译器、编译器版本甚至编译器标志而改变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      • 2014-03-06
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多