簡體   English   中英

C編程-字符數組與字符串數組的地址消除歧義

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM