2011-11-03 34 views
-1
const char *pointerStr[]= 
{ 
    "BEST123,  ",  // 0x00 
    "Best2233,  ",  // 0x01 
    "ABCDEFGH,  ",  // 0x02 
    "123456,  ",  // 0x03 
    "helloworld,  "  // 0x04 
}; 
typedef struct 
{ 
    char value; 
    char name[40]; 
}StrInfo; 

typedef struct 
{ 
    int regMax; 
    StrInfo info[60]; 
} structNew; 

void main() 
{ 
    int i; 
    structNew pret; 
for (i=0;i<5;i++) 
{  
    printf("PointerStr size of %dth %d \n",i,sizeof(pointerStr[i])); 
    printf("pret size of %dth %d \n",i,sizeof(pret.info[i].name)); 
} 
} 

的上述程序產生的sizeof如何工作?存儲器映射可變長度字符串數組

PointerStr size of 0th 4 
pret size of 0th 40 
PointerStr size of 1th 4 
pret size of 1th 40 
PointerStr size of 2th 4 
pret size of 2th 40 
PointerStr size of 3th 4 
pret size of 3th 40 
PointerStr size of 4th 4 
pret size of 4th 40 

如果我想知道每一個的大小和PointerStr每個字符串再怎麼找呢,結果呢?是否有可能只使用strlen?我們有其他方法嗎?這個變長數組如何存儲在內存中? 結果是因爲pointerStr是指針變量,其大小始終爲4.請糾正我,如果我錯了。

+0

對於普通的以0結尾的字符串,就像'pointerStr ',那麼'strlen'就是你應該使用的。 –

+2

代碼中沒有可變長度數組。所有這些都是在編譯時固定的。 –

回答

7

C字符串的長度是隱含的:它由字符串中終止的位置決定,所以您需要使用類似strlen的函數來確定字符串的長度。

sizeof返回的值由編譯器通過查看數據的類型而不是數據本身來確定。

1

sizeof是一個編譯器的東西。它提供了數據的大小,如編譯期間所見。它在執行時與動態內存分配無關。所以sizeof(char*)sizeof(p)與變量聲明爲char* p;通常是字的大小(即在32位處理器上4,在64位處理器上8),並且與動態分配,或與字符串的實際長度無關程序運行時。

2

你得到數組長度的原因,但只有char*指針的大小,sizeof不是一個函數調用,而是實際上在編譯時計算(除了變量長陣列)。

您的代碼舉例說明了數組和指針之間的關鍵區別。在編譯時,編譯器確切知道數組的長度(40),因爲它的大小是靜態的。另一方面,char*甚至不一定指向空終止的字符串,所以它返回指針的大小。

查找字符串長度的正確方法是使用strlen。但是,請注意,這會告訴您第一個空字節(\0)之前的字符數。它不會告訴你實際分配了多少內存(這是sizeof返回40時正在執行的操作)。

+0

@undur_gongor好點。編輯。 –

1

sizeof爲您提供傳遞給它的變量的字節大小。您將指針數組(指向字符串)傳遞給sizeof。 C中的數組「衰減」爲指針,因此您得到的是指向指針數組中第一個元素的指針。

然後你以字節(4字節= 32位地址總線)正確得到指針的大小。

由於「數組衰減」規則,您無法通過該指針獲取字符串文本的實際內存單元大小,因爲您無法通過該指針獲取數組大小指針PTR在這個例子中:

char array[10] = "..."; 
char* ptr = &array; 

的解決方案是存儲陣列以不同的方式,其中可以使用對陣列本身的sizeof(像一個真正的2D陣列),或存儲所有數組大小在查找表:

const size_t STRING_SIZES[] = 
{ 
    sizeof("BEST123,  "), 
    sizeof("Best2233,  "), 
    sizeof("ABCDEFGH,  "), 
    sizeof("123456,  "), 
    sizeof("helloworld,  ") 
}; 
相關問題