2015-06-08 66 views
-2

任何人都可以解釋我這個程序做什麼?(unsigned char *)&niz [10]是什麼意思?

#include<stdio.h> 
int main() 
{ 
    unsigned char niz[20000]; 
    unsigned char *pok; 
    pok = (unsigned char*)&niz[10]; 
    printf("%s",*pok); 
    return 0; 
} 

當運行該程序,它說:

警告:格式%s預計char *類型,
但參數2具有鍵入參數int [-Wformat =] printf("%s",*pok);

pok = (unsigned char*)&niz[10];系列是做什麼的?

爲什麼不能在終端打印結果?

+1

程序將在兩個帳戶上顯示未定義的行爲:使用未初始化的變量並在'printf'中使用錯誤的格式。 –

+0

想一想:printf調用中表達式'* pok'的表達式的類型是什麼? – juanchopanza

+0

我嘗試過'printf(「%d」,* pok)',它說0.爲什麼有效,如果'* pok'是字符類型? – HardRock

回答

2

關於你問的行:

printf ("%s", * pok); 

傳遞兩個參數來printf。首先是格式字符串"%s"。第二個* pok,即pok指向的值。由於您寫了pok = & niz[10];(不必要的轉換爲(unsigned char *) - 儘可能少投!),pok點在niz[10],這是一個未初始化的unsigned char,它可能有任何值從0UCHAR_MAX;因爲它被傳遞給未指定類型的參數,所以在傳遞之前將其提升爲int,但仍具有相同的數值。

控制現在轉到printf,以檢索格式字符串"%s"和,因爲它看到的字符串符,解釋該參數列表的其餘部分爲包含字符串,從它嘗試接收在字符的地址一次一個字符串,直到找到終止的null。會發生什麼事,然後是不確定的,但可能有兩個可能性:

  • 如果類型char *,其大小與int一樣,它將檢索niz[10]的價值,並把它解釋爲一個非常低的地址。該地址很可能被處理器認爲是無效的,導致地址違規並停止您的程序。
  • 如果char *類型大於int,它將會獲取一些額外的位,這些位可能位於地址的高位或低位,具體取決於系統如何組織內存。你會得到一個相當隨機的地址,這可能是無效的,結果與前面的情況相同。

無論哪種情況,地址都可能是您允許讀取的地址;在這種情況下,程序將打印該地址和後續地址的內容,假定它們是可打印的字符,如果它們不是(除非將輸出傳送到諸如od -oc之類的命令),那麼它們可能會對您的終端執行奇怪的操作。這將繼續,直到其中一個不可預知的字符爲零,在這種情況下,它將停止,或者地址變爲無效,在這種情況下,您的程序將再次因地址違例而停止。

+0

非常感謝您對此解釋的感謝...... – HardRock

+0

完全沒有,很高興幫助! – PJTraill

+0

@PJTraill在第二行應該是pok =&niz [10]; –

1

你的第五行

pok=(unsigned char *)&niz[10]; 

將分配的

char niz[10] 

地址指針學。

而在你的第六行,你基本上打印在地址值上博安點 這是顯而易見的,你做錯了

char niz[10] 

但有一件事是,你傳遞一個錯誤的格式標識符%s如果你想要在地址上打印值,您應該使用%c而不是%s。

1
unsigned char niz[20000] 

//聲明的20000個ASCII字符

unsigned char *pok; 

陣列//聲明瞭一個字符指針。所以POK爲將包含 地址任何無符號字符變量的變量

pok=(unsigned char *)&niz[10]; 

//學被分配陣列的第11字符的地址(索引從0開始)

printf("%s",*pok); 

// 「* pok」試圖在pok包含的地址處打印特定字符。但%s會嘗試從ptr中包含的地址開始打印以null結尾的字符串。因此,警告