2011-06-26 50 views
1

我有這樣的功能:我怎樣才能在C中獲得我的矢量的大小?

void receive_message(int sock, char buffer[]) { 

    int test = recv(sock, buffer, strlen(buffer), 0); 
    buffer[test] = '\0'; 
} 

功能recv()的第三個參數是行不通的。顯然我不能使用strlen(),因爲緩衝區沒有\0sizeof()也沒有幫助我。我希望我可以做到這一點,而不需要向我的功能receive_message()傳遞第三個參數。

謝謝。

+0

在C中,你沒有「矢量」。 –

+0

btw使用sizeof是有意義的(如果信息可以在編譯時檢索到,但不能),而使用strlen是錯誤的。在這裏還有另一個可能的問題:'recv'可以讀取比預期更少的字節(通常對於小數據包它不會發生),即可以截斷接收數據(可能會有更多關於「message」重新等待);並且如果它填滿了所有的緩衝區,讀取可以放入緩衝區的最大字節數,你的'buffer [test] = 0'可能會導致分段錯誤,或者無法寫入對內存的訪問錯誤。 – ShinTakezou

+0

@ShinTakezou你會推薦我'read'和'write'而不是'send'和'receive'嗎? –

回答

10

你希望是徒勞的; C數組沒有那麼多的結構。你需要自己傳遞大小。

+4

C中的[Most]數組包含它們的長度,作爲_static_類型信息的一部分。但是,'buffer'不是數組。 –

1

如果不是零終止,則無法獲取大小。您別無選擇,只能將大小作爲參數傳遞或零終止字符串。

1

你不能這樣做。傳遞額外的參數,或在緩衝區定義和使用中使用#define

2

buffer不是矢量。它可能看起來像一個數組,但是因爲它被聲明爲一個函數參數,所以它實際上是一個指針。沒有辦法知道指針指向的緩衝區有多長時間,除非您知道該指針終止於標記值(例如\0)。

讓函數獲取額外參數可能是最容易的。