2016-03-11 90 views
-5

我一直在試圖解決從這個網站上的「MIME類型」之謎:https://www.codingame.com/games/puzzles/我需要幫助想了解這段代碼關於結構和指針

而且我發現一個答案,這個難題以下網站: http://ethiery.vvv.enseirb-matmeca.fr/CGsolo/mime-type.html

  1. 有人可以解釋從上面的鏈接p = d.elmts+i;(49行)做什麼?
  2. 爲什麼當我省略第49行並在隨後的行中使用此代碼時它不工作? (直到我嘗試使用d.elmts [i] .ext/mime打印ext和mime時才顯示錯誤)。當我使用p = d.elmts+i;時,它就像一個魅力。 (計算器上的第一次,我不知道這是否會顯示爲一個代碼段。道歉,如果事實並非如此)

代碼

d.elmts[i].ext = malloc(11*sizeof(char)); 
d.elmts[i].mime = malloc(51*sizeof(char)); 
scanf("%s %s\n",d.elmts[i].ext, d.elmts[i].mime); 
+5

您正在尋找C書或教程。堆棧溢出是他們中的任何一個。 – Olaf

+2

在StackOverflow上有一個很棒的[推薦C書籍列表](http://stackoverflow.com/q/562303/253056)。 –

回答

0
  1. p是一個指向結構 - 這意味着P「保持」的起始地址的結構在內存中 - 因此:p = d.elmts + i表示當前結構(i表示地址偏移量)的內存中的起始地址。 在這個例子中,內存已經分配給'dictSize'結構(即結構的數量)。 請注意,結構的內存是連續分配的(即下一個對象),因此可以使用保留內存的起始地址(iedelemts)和一些偏移即我很容易地訪問,即如果指向aa結構被聲明,那麼當使用箭頭符號時,底層結構成員只能被指針訪問。 如果聲明瞭結構(不是指向結構的指針),則可以使用點符號訪問基礎結構成員。

  2. 在C語言中使用'[]'符號可能被解釋爲試圖分配一個實際值(已分配的內存) - 而第50和51行中使用的指針符號只是啓用分配內存即指向被分配的內存的起始地址 - 保存每個成員可能假設的可能值,即,尚未將值存儲在該存儲器中 - 必須首先創建/分配存儲器。

0

elmts是數據類型對。

p = d.elmts+i; 

該表達式僅基於i將下一對分配給p。指針將從elmts(指針算術)移動到sizeof(pair)* i。

該對包含以下2個指針成員,您需要在使用它們之前分配內存。這就是接下來的兩行。

char * ext; char * mime;

如果指針未移動,它將指向同一對。

爲等效陣列表達「P = d.elmts + i」是

p = &(d.elmts[i]);