c程序指针

时间:2010-04-27 18:38:16

标签: c pointers

我正在尝试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个增量)

然后,如果在这种情况下,新指针地址将覆盖先前地址的内容以及新地址中包含的值

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

首先,我假设您对printf的调用应显示xyz地址 abc,对吗?在这种情况下,您需要将它们更改为:

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

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

  

并且在增加之后   指针的值是65526(为2   int的增量

假设您所在的平台int为2个字节(在大多数现代家用电脑上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),那么您刚刚损坏了程序的状态。

答案 2 :(得分:1)

如果您正在尝试输出指针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);

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

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