2012-04-18 88 views
1

我想動態創建一個char數組。然而,不管我把它放在哪個數字作爲size數組的期望值,它只是繼續使用4的大小。如果我把3,2甚至8,10也不會改變......動態字符數組,大小固定?

部分,我將其初始化...

char *x; 

x = (char *)calloc(10, sizeof(char)); 

if(x == NULL) 
{ 
    return; 
} 

cout <<"Size_Vector = "<<sizeof(x)<<endl; //Keep making the size of the array 4..no matter what 
+10

cout在C中不存在。 – 2012-04-18 04:40:10

回答

2

sizeof(x)返回指針的大小而不是分配的內存或數組的大小。

它總是返回4您的環境指針的大小爲4,它對所有人都是一樣的。

你將不得不跟蹤你自己分配了多少內存&也確保你不會超出分配內存的範圍。

+0

如果我想創建數組大小2,那麼怎麼辦?我如何改變calloc中的sizeof(char)呢? – SpcCode 2012-04-18 04:35:38

+1

@SpcCode:'x =(char *)calloc(2,sizeof(char));''給你2 char的內存分配。 – 2012-04-18 04:38:13

+0

哦,明白了......編譯器崩潰了,因爲我是這樣打印的:for(i = 0; i SpcCode 2012-04-18 04:44:25

2

xchar *類型的指針。 sizeof(x)返回指針的大小而不是數組大小。

通常,由於array decaying,無法從指針類型知道數組大小,即使它指向數組。

char *x = malloc(sizeof(char)*10); 
// This will give you 4 
printf ("%d\n", sizeof(x)); 

但是你可以得到一個數組類型的大小。

char x[10]; 
// This will give you 10 
printf ("%d\n", sizeof(x)); 
0

malloc調用返回一個void指針,當你說sizeof(指針)時,你要求指針的大小,而不是你剛剛聲明的內存塊。所以它給你4/8/...字節取決於你使用的m/c。

試試這個:

char * cptr;

int * iptr; (「整數指針的大小是:%d \ n」,sizeof(iptr)); printf(「字符指針的大小是:%d \ n」,sizeof(cptr));

注意:malloc指向您通過調用它動態獲取的內存塊的第一個元素(即10 * 1 = 10個字節)的地址。

+0

指針並不總是4個字節。在64位系統上,它們是8.在不尋常的系統上,它們可以是任意大小。 – 2012-04-18 05:16:24

+0

對不起,我在這裏指的是32位m/c。 – Phoenix225 2012-04-18 05:22:26

+0

但在任何情況下調用calloc或malloc都會返回一個void指針,而當您執行sizeof(指針)時,您將始終獲取可能爲4/8/...的大小或取決於m/c的大小 – Phoenix225 2012-04-18 05:24:18

0

這是我爲你寫的一小段代碼,如果你真的想通過調用calloc找到你保留的內存塊的大小,雖然它明顯地說,當你說10個空格的每個1字節然後你要去獲得10個字節喜歡這裏的情況下,它說你要10 *的sizeof(字符):

包括

包括

的main(){

char *ptr = NULL; 

    int i = 0; 

    int size = 0; 

    int n = 0; 

    printf("Enter the size of the dynamic array in bytes : "); 

    scanf("%d",&n); 

    ptr = (char*) calloc (n,sizeof(char)); 

    for(i=0;i<n;i++){ 

      size = size + sizeof(ptr[i]); 

    } 

    printf("Size is %d\n",size); 

}

+0

謝謝你真棒! – SpcCode 2012-04-18 06:43:15