2013-10-25 52 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