2016-07-05 107 views
1

當編譯這個程序時,我收到了一個我從未想到的輸出。當我回顧這個節目時,我預計指針的結果仍然是「你好,世界!」因爲據我所知指針從未受pointer2的影響。然而,我的輸出顯示,當指針被打印時,它包含指針2的字符串「y you guys!」。這是怎麼回事?謝謝!!指針程序混亂(c編程)

#include <stdio.h> 
#include <string.h> 

int main() { 
    char str_a[20]; 
    char *pointer; 
    char *pointer2; 

    strcpy(str_a, "Hello, world!\n"); 
    pointer = str_a; 
    printf(pointer); 

    pointer2 = pointer + 2; 
    printf(pointer2); 
    strcpy(pointer2, "y you guys!\n"); 
    printf(pointer); 
} 

輸出

Hello, world! 
llo, world! 
Hey you guys! 
+1

指針指向內存地址。也就是說,'pointer'指向'str_a'的基地址,pointer2指向'str_a'的基地址之前2個字節。所以,每次訪問任何指針時都會影響'str_a'數據。 – pah

回答

7

你必須的存儲器中的單個區域,陣列str_a。看起來在內存中是這樣

strcpy調用和分配到pointerpointer2是:

 
+---+---+---+---+---+---+---+---+---+---+---+---+---+----+----+----------------------+ 
| H | e | l | l | o | , | | w | o | r | l | d | ! | \n | \0 | (uninitialized data) | 
+---+---+---+---+---+---+---+---+---+---+---+---+---+----+----+----------------------+ 
^  ^
|  | 
|  pointer2 
| 
pointer 

變量pointerstr_a[0]pointer2str_a[2]

當你調用strcpypointer2作爲目標,您更改內存pointer2點,這是相同的陣列pointer也指出,只是一對夫婦的性格走得更遠。

+2

哦,不錯的展示。不能頂上那個。