2013-03-02 80 views
1

我對c編程有比較好的經驗。它一直是我最喜歡的語言之一。今天在研究shell編程時,我遇到了一個在我的Linux系統上執行的c程序(Backtrack 5 r2)。該程序有一個奇怪的輸出,我真的無法弄清楚。奇怪輸出的c程序

下面的代碼...

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    char array[] = { 0x25, 115, 0 }; 
    char array2[] = { 68, 0x61, 118, 0x69, 0144, 040, 
         0107, 97, 0x74, 119, 0157, 0x6f, 
         100, 0x20, 0x72, 117, 'l', 0x65, 
         115, 041, 012, 0 }; 

    printf(array, array2); 
} 

使用gcc和執行編譯的代碼得到的輸出作爲

大衛Gatwood規則!

無法真正瞭解如何以及爲什麼得到此輸出。據我所知,將一個數組的名稱傳遞給'printf'只需打印數組的基地址,即數組的第0個元素的地址。只有在'printf'語句中使用適當的格式說明符時,這也會被正確顯示。

那麼我錯在哪裏,或者我忽略了一些重要的東西,還是因爲gcc?

+0

格式字符串,字符串。沒有什麼比 – 2013-03-02 07:57:23

+0

格式字符串...?怎麼樣 ...??什麼是0x25,115,0 ??? – qre0ct 2013-03-02 07:58:00

+0

0x25 =='%'...... – 2013-03-02 07:58:35

回答

3

該程序是隻寫

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    char array[] = { '%', 's', '\0' }; 
    char array2[] = { 'D', 'a', 'v', 'i', 'd', ' ', ..., '\0' }; 

    printf(array, array2); 
} 

由於printf的預計作爲格式的字符串的模糊方式,而在這樣的被視爲(「衰變」的表達式中使用的陣列的名稱,儘管該術語不是官方的標準)指向它的第一個元素,一切都是正確的。事實上,初始化相當於

char *array = "%s"; 
char *array2 = "David ..."; 

不同之處在於後者是不可寫的(因爲字符串文字在C-只讀)。

不,將一個數組傳遞給printf(究竟是哪裏?)不是打印它的地址。打印數組地址(或指針)只能與%p轉換說明來完成:

printf ("array/ptr address = %p\n", (void *)array); 

注意,(void *)鑄造是需要避免未定義的行爲。

4

array想象成"%s"。因此printf打印一個字符串。

ASCII 0x25: % 
ASCII 115: s 

同樣爲array2。我不知道爲什麼作者混合十進制十六進制和八進制。

0

當你做什麼時,你會期待什麼printf("%s", "David Gatwood rules!"); 正如你所寫的,你有c的經驗,你應該也看過指向字符數組的字符串作爲c字符串的指針。