[英]C programming - array of chars vs array of strings addressing disambiguation
char contents[8][2]={"1","2","3","4","5","6","7","8"};
char* contentsx[8]={"1","2","3","4","5","6","7","8"};
printf("Contents: %s\n", contents[1]);
printf("Contents: %s\n", &contents[1]);
printf("Contentsx: %s\n", contentsx[1]);
printf("Contentsx: %s\n", &contentsx[1]);
版畫:
Contents: 2
Contents: 2
Contentsx:2
Contentsx: //prints nothing or some garbage character
問題是,為什么content [1](它是元素1的值)會打印與&contents [1] (它是元素1的地址)相同的結果,並且在這種情況下,為什么contentx [1]的值不同於&contentsx [1] (具有一些不確定的行為)
的contents
陣列是一個8×2陣列char
。 它的元素是char[2]
-2個char
的數組。 因此, contents[1]
是位於索引1
處的char[2]
的數組。 當您獲取該數組的地址時,它與該數組的初始元素的位置相同,即&contents[1][0]
,與字符串"2"
的初始元素的位置相同。
盡管char[2]
的地址不是 printf
'為其%s
格式說明符所期望的,但在這種情況下它確實可以工作,因為該地址恰好匹配。 但是,這被認為是未定義的行為。
當對指針contentsx
的數組嘗試相同的操作時,結果將有所不同:現在,您將在索引1
處傳遞指針的地址,該地址不再與字符串的位置重合,從而再次導致未定義的行為。 但是,這一次,未定義的行為表現為不打印任何內容或打印隨機字符。
那是因為contents
是一個數組數組。
contents[1]
表示此數組數組中的第二個數組。 這樣,它的名稱就會變成指向其第一個元素的指針,該元素的大小為1。 &contents[1]
指向整個數組,其大小為2。
xcontents[1]
是一個char *
指向給定字符串的確切位置。 &xcontents[1]
是指向條目的char **
,在本例中為char *
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.