2012-02-08 132 views
1

我正在嘗試編寫一個將基本10整數轉換爲二進制數的函數。與sizeof()函數的結果相混淆

我構造函數是這樣的:

void dec2bin(int dec, char * bin); 

功能將通過在參數指針的手段二進制結果存儲。

char *r1 = (char *)malloc(24); 

功能需要做的第一件事是填寫了「24位的結果,」與所有零:它如下傳遞別處聲明的變量。它現在很好用,因爲我知道「尺寸」的基礎上對它進行了編碼,但我無法弄清楚如何確定任意「r1」的「尺寸」。我認爲使用sizeof函數的每種方式都不會給我24.

我對此感到困惑,並沒有連接char,char *等的各個大小之間的關係,以及如何使用這些關係大小來獲得我正在尋找的關於「r1」的內容。

有人會介意給我一個指針嗎?潘打算。

謝謝!

+0

答案很簡單:你不能。 – 2012-02-08 19:42:59

+0

@FredLarson:我同意,你不能。而且,這不是雙關。 :-( – Mithrandir 2012-02-08 19:44:26

+0

'malloc'返回一個指針,所以不需要施加'malloc'調用的返回值。 – 2012-02-08 19:45:00

回答

3

我不知道如何確定任意「r1」的「大小」。

你不能做到這一點:關於你傳遞給malloc調用之後不可逆轉地失去了大小的信息。那時你所擁有的只是一個指向至少24字節內存塊的指針。如果你需要這個大小,你需要將它存儲在其他地方 - 例如,在你攜帶的一個單獨的變量中。

解決此問題的兩種典型解決方法包括(1)在分配的空間中存儲零終止字符串,並使用該字符串的長度作爲分配塊大小的代理,以及(2)定義您自己的結構包含大小和分配的指針。這兩種解決方案都不是理想的,但至少是你的選擇。

1

r1的類型是一個char *(char指針),因此,像所有指針一樣,其大小爲4(或8,取決於您的情況)。不管你分配給它的內存塊的大小。

無法從指針中檢索分配塊的大小,因此如果您稍後需要大小,則必須記住yoursef的大小(例如,通過將其存儲在不同的變量中)。

1

r1指針類型的變量,其大小是固定的並且總是相同的(就像的尺寸的給定類型的任何變量),這是不大於(並且通常等於) sizeof(void *)。你真正想知道的是位於*r1(注意星號)的數組的大小,這是,你不知道。你要跟蹤它自己,通常是這樣的:

size_t const n = get_some_number(); 
foo * p = calloc(n, sizeof(foo)); 

現在使用pn)來描述你的動態數組。

(請注意,C99和C11有變長數組的概念,在其上下文sizeof不實際(有時)給你的實際數組的大小,但是這是一個有點陰暗的事情,在任何情況下,是不是你問什麼。)

1

當您分配內存,你回來的指針,它有一個固定的大小,所以沒有辦法讓與的sizeof分配的內存的大小。

4

你可能只是傳遞大小爲另一個參數:

void dec2bin(int dec, char * bin, size_t max_chars); 
1

正如其他人所說,如果它只是一個指針,你將不能告訴任何東西(除非它是零終止,在這種你可以迭代直到你遇到一個等於零的元素(而不是字符'0'))。

不過,如果你將它設置如下,你可以看到的緩衝區大小調用sizeof()後......至少,直到你把它發送給一個函數,數組衰變爲普通char*指針。

void test(char* s) 
{ 
    int i2 = sizeof(s)/sizeof(char); 
} 

char c1[] = "Testing!"; 
int i1 = sizeof(c1)/sizeof(char); // i1 is 9 (size of buffer) 
test(c1);        // i2 is 4 (size of pointer)