2017-08-07 49 views
0

我對C.目前正在研究陣列,我運行此代碼C如何確定數組的邊界?

#include <stdio.h> 

signed char cData[][2][3] = {1,2,3,4,5,6}; 

int main() 
{ 
    printf("%d\n", cData[0][0]); 
    return 0; 
} 

答案是4210700
我想知道如何確定第一個邊界? 我怎樣才能得到編號4210700而不是1

+0

如果數組是字符,那麼你爲什麼要告訴printf的把它解釋爲32位整數? –

+2

它並不重要,因爲它將printf作爲整數平鋪。 –

+1

也許你打算做'cData [0] [0] [0]'?否則,代碼沒有多大意義。 – Lundin

回答

5

cData[0][0]基本上是一個指針(signed char *類型),您需要%p說明符。

printf("%p\n", (void *)cData[0][0]); 
0

你忘了一對括號

 printf("%d\n", cData[0][0][0]); 

初始化如何工作的:第一個維度填充,然後第二和第三。取決於初始化的數量和牙套所需的最小確定

+0

正常情況下,'括號'是指'大括號','{}',而不是方括號'[]'。我從來沒有聽說過方括號被稱爲括號。圓括號'()'也被稱爲圓括號,方括號有時被稱爲括號(而'<>'有時也被稱爲'尖括號')。 –

4

這個聲明

signed char cData[][2][3] = {1,2,3,4,5,6}; 

是聚集聲明。你可以把它改寫以下方式

typedef signed char T[2][3]; 
T cData[] = {1,2,3,4,5,6}; 

反過來類型T是一種類型的骨料。其成員有類型signed char[3].

按照C標準(6.7.9初始化)

17每個大括號包圍的初始化列表具有相關聯的電流 對象。當不存在指定時,根據當前對象 對象的類型對當前 對象的子對象進行初始化:以下標順序遞增的數組元素,以聲明順序構造的 成員以及聯合的第一個已命名成員...

20如果聚集或聯合包含的元素或成員是 聚集或工會,這些規則遞歸適用於 subaggregates或含有編輯聯盟。如果 子集或包含的聯合的初始化程序以左大括號開始,則大括號及其匹配的右大括號 所包含的初始值設定項會初始化子集或包含聯合的 的元素或成員。 否則,只有來自列表 的足夠的初始化程序被用於說明子集團 的元素或成員或所包含工會的第一個成員;任何其餘的初始化程序 都將被初始化爲當前子集聚或包含的聯合是其一部分的集合 的下一個元素或成員。

因此,首先初始化signed char[3]類型的最內層聚合體。然後初始化signed char[2][3]類型的聚合的第二個成員。反過來,它是signed char [][2][3]類型的聚合的成員。所以這個聚合的一個成員只有一個初始化器。

由於結果cDara將有類型signed char[1][2][3]

表達式cData[0][0]的類型signed char [3]在函數調用中隱式轉換爲指向其第一個元素的指針。

所以在此聲明

printf("%d\n", cData[0][0]); 

你想輸出的地址signed int,一般是未定義行爲。

如果要輸出的第一個元素作爲一個整數,你應該寫

printf("%d\n", cData[0][0][0]);