【问题标题】:c program pointerc程序指针
【发布时间】:2010-04-27 18:38:15
【问题描述】:

我正在尝试 c 中的一些程序,但遇到了这个程序的问题 谁能告诉我这是什么问题,我也想知道,在上述情况下,如果指针值增加,那么它会将先前的值地址覆盖为

#include<stdio.h>
int main()
{
    int a=9,*x;
    float b=3.6,*y;
    char c='a',*z;
    printf("the value is %d\n",a);
    printf("the value is %f\n",b);
    printf("the value is %c\n",c);
    x=&a;
    y=&b;
    z=&c;
    printf("%u\n",a);
    printf("%u\n",b);
    printf("%u\n",c);
    x++;
    y++;
    z++;
    printf("%u\n",a);
    printf("%u\n",b);
    printf("%u\n",c);
    return 0;
}

假设我们在上面的程序中得到的值(没有指针值的增量)是 65524 65520 65519 并且在增量之后指针的值是 65526(作为 int 的 2 个增量) 65524(作为浮动的 4 增量) 65520(作为 char 变量的 1 个增量)

那么如果在这种情况下,新的指针地址是否会覆盖先前地址的内容以及新地址中包含的值

【问题讨论】:

  • 请不要把你的代码加倍。
  • 您的变量声明令人困惑。我建议将任何带有初始化的声明单独放在它的行上。

标签: c pointers


【解决方案1】:

你不能像那样增加 x,y,z。
您无法保证它们按该顺序排列在内存中 - 'x' 之后的内存地址可以是任何东西。

编辑只是为了澄清: 是的,你可以增加一个指针,但你必须确保你“拥有”你所指向的内存——通常是字符串或数组中的内存。

您不能假设单独的变量在内存中彼此相邻 - 事实上,不同的类型可能会被隔开,以便每个新变量从 4 字节边界开始。

【讨论】:

    【解决方案2】:

    首先,我假设您对printf 的调用应该显示xyz 的值,或者a、@ 的地址 987654326@ 和c,对吗?在这种情况下,您需要将它们更改为:

    printf("%p\n", x);
    printf("%p\n", y);
    printf("%p\n", z);
    

    这些将考虑处理器上指针的大小,如果它与int 的大小不同的话。他们还将以十六进制打印地址,这更为常见,因为地址可能会变得非常大。

    在增量之后 指针的值为 65526(如 2 int 的增量)

    假设您在一个平台上,int 是 2 个字节(在大多数现代家用 PC 上,int 现在可能是 4 个字节)。

    那么如果在这种情况下,新的 指针地址覆盖内容 以前的地址和什么值 包含在新地址 ......请帮助

    您实际上并没有取消引用这里的任何指针。所以abc占用的内存还是没动过;你所做的只是改变了xyz 所指向的内容。如果您要在增加其中一个指针后取消引用它,您将修改它最初指向的变量的内存过去。因此,如果a 位于十进制地址 65526 且int 为 2 个字节:

    int *x = &a; // x points to the integer at "65526" (a)
    x++;         // x points to the integer at "65528", a is still at 65526
    *x = 5;      // you've just modified the memory at addresses 65528 and 65529.
    

    如果 65528 或 65529 包含其他一些重要数据(如 bc),则您刚刚破坏了程序的状态。

    【讨论】:

      【解决方案3】:

      如果你想输出指针 x、y 和 z 的值,那么你需要像这样改变最后六个 printf 语句:

      printf("%p\n",x);
      
      printf("%p\n",y);
      
      printf("%p\n",z);
      
      x++;
      
      y++;
      
      z++;
      
      printf("%p\n",x);
      
      printf("%p\n",y);
      
      printf("%p\n",z);
      

      以这种方式打印它们将打印它们的地址,并且您应该在增加它们后看到它们的地址变化。

      但是,如果您在递增它们之后尝试访问存储在其中的 ,您将得到垃圾或程序崩溃。当您像这样增加指针的值时,它将指向内存中的下一个位置。当指针指向一个数组时,它将指向数组的下一个单元格。但是,您的指针不指向数组,因此它们指向的地址可能无效。

      【讨论】:

      • @Hasturkun 谢谢,只是知道它不适合 float 或 int 假设它是指针而没有仔细检查自己。很久以来我不得不打印一个指针,现在修复了;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2021-05-16
      相关资源
      最近更新 更多