逐渐增加指针的地址

时间:2013-10-25 10:59:37

标签: c pointers memory-address

我是c编程的新生,我做了一个小程序,在动作中看到了指针中++的所有组合。所以我编写了:(我通过virtualbox在Ubuntu中运行它)

 #include <stdio.h>

 main()
 {
    int num = 1;
    int  *p = &num;

    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(十六进制))

为什么地址的增量不稳定?

2 个答案:

答案 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