我正在尝试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个增量)
然后,如果在这种情况下,新指针地址将覆盖先前地址的内容以及新地址中包含的值
答案 0 :(得分:4)
你不能像这样增加x,y,z 你不能保证它们按照这个顺序排列在内存中 - 'x'之后的内存地址可以是任何东西。
编辑只是为了澄清: 是的,你可以增加指针,但你必须确保你拥有你所指向的内存 - 通常是字符串或数组中的内存。
你不能假设单独的变量在内存中彼此相邻 - 事实上,不同的类型可能会间隔开来,以便每个新的变量从4字节的边界开始。
答案 1 :(得分:2)
首先,我假设您对printf
的调用应显示x
,y
和z
或地址的值 a
,b
和c
,对吗?在这种情况下,您需要将它们更改为:
printf("%p\n", x);
printf("%p\n", y);
printf("%p\n", z);
这些将考虑处理器上指针的大小,如果它与int
的大小不同。他们还将以十六进制打印地址,这更常见,因为地址可能变得非常大。
并且在增加之后 指针的值是65526(为2 int的增量
假设您所在的平台int
为2个字节(在大多数现代家用电脑上int
现在可能是4个字节)。
然后,如果在那种情况下将是新的 指针地址覆盖内容 以前的地址和什么价值 包含在新地址中 ......请帮助
您实际上没有取消引用这里的任何指针。因此a
,b
和c
占用的内存仍未受影响;您所做的一切都已更改为x
,y
和z
所指向的内容。如果你在增加它之后取消引用其中一个指针,你将修改内存过去它最初指向的变量。因此,如果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包含其他一些重要数据(例如b
或c
),那么您刚刚损坏了程序的状态。
答案 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);
以这种方式打印它们将打印它们的地址,您应该在增加它们后看到它们的地址发生变化。
但是,如果您在增加它们之后尝试访问存储在其中的值,您将获得垃圾或程序将崩溃。当你增加像这样的指针的值时,它将指向内存中的下一个位置。当指针指向数组时,它将指向数组的下一个单元格。但是,您的指针不指向数组,因此它们指向的地址可能无效。