2013-10-25 120 views
1

我是c编程的新生,我做了一个小程序,在动作中看到指针中++的所有组合。因此,我codded:(ⅰ通过的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(十六进制))
第3次增量后地址为08bd(增加100(十六进制))

为什么地址增量不稳定?

+0

不要忘记添加返回0;在主要结束时。总是使用return 0,并且尝试使用int main()而不是main(),因为c99严格检查返回类型 – niko

回答

1

您的程序有未定义的行为:您的代码在高级后无法写入*p,因为此时指针指向的内存未分配给int。由于变量被声明的方式,看起来在第一次增量之后,指针实际上指向它自己!打印指针&p的地址应该确认。

要解决此问题,更改您的程序如下:

int data[] = {0,0,0,0,0,0,0,0,0,0}; 
int *p = data; 

现在你可以增加你的指针多达十次不分配给你的程序的范围之外写入内存的风险。

注意:%p需要一个void*指针,所以您应该插入一个明确的转换。

+0

我忘记了%p需要(void *)&p。我改变了这个,现在'0xbfabdf98' - >'0xbfabdf9c' - >'0xbfabdf9d'的结果更有意义。另外'int p = #'@dasblinkenlight – yaylitzis

+0

@ Nat95它需要'(void *)p'。当你传递'(void *)&p'时,你正在打印指针本身的地址,它应该在整个程序中保持不变。我建议打印'(void *)&p',以便在'num'后面分配它:在'p ++'之后,指针将指向它自己。 – dasblinkenlight

-1

发生这种情况的原因通常是内存不是由O.S.顺序分配的。作为开始,您可以阅读更多here