我是c编程的新生,我做了一个小程序,在动作中看到了指针中++的所有组合。所以我编写了:(我通过virtualbox在Ubuntu中运行它)
#include <stdio.h>
main()
{
int num = 1;
int *p = #
printf("\nnum position: %p num value: %d\n", p, num);
*p += 1;
printf("\n---- *p += 1; -----\n");
printf("num position: %p num value: %d\n", p, num);
*p++;
printf("\n---- *p++; -----\n");
printf("num position: %p num value: %d\n", p, num);
(*p)++;
printf("\n---- (*p)++; -----\n");
printf("num position: %p num value: %d\n", p, num);
++(*p);
printf("\n---- ++(*p); -----\n");
printf("num position: %p num value: %d\n", p, num);
++*p;
printf("\n---- ++*p; -----\n");
printf("num position: %p num value: %d\n\n", p, num);
}
输出:
num position: 0xbfce07b8 num value: 1
---- *p += 1; -----
num position: 0xbfce07b8 num value: 2
---- *p++; -----
num position: 0xbfce07bc num value: 2
---- (*p)++; -----
num position: 0xbfce07bd num value: 2
---- ++(*p); -----
num position: 0xbfce08bd num value: 2
---- ++*p; -----
num position: 0xbfce08bd num value: 2
我已经理解了++的不同用法。不过我的问题是关于地址(我只写4位数)
首先地址是: 07b8
第一次增加后地址 07bc (增加4(HEX))
第二次增量后,地址 07bd (增加1(十六进制))
第三次增量后地址 08bd (增加100(十六进制))
为什么地址的增量不稳定?
答案 0 :(得分:1)
您的程序有未定义的行为:您的代码在高级后无法写入*p
,因为此时指针指向未分配给int
的内存。由于你的变量被声明的方式,看起来在第一次增量之后指针实际指向它自己!打印指针&p
的地址应该确认。
要解决此问题,请按以下步骤更改您的程序:
int data[] = {0,0,0,0,0,0,0,0,0,0};
int *p = data;
现在,您可以将指针增加十倍,而不会有在写入分配给程序的范围之外的内存的风险。
注意:%p
需要一个void*
指针,因此您应该插入一个显式的强制转换。
答案 1 :(得分:-1)
这是因为通常内存不是由O.S顺序分配的。首先,您可以阅读更多here。