2009-03-04 191 views
11

我已經將緩衝區設置爲大小100. 我在聲明緩衝區的主函數中顯示緩衝區。但是,當我將緩衝區傳遞給函數並獲取sizeof'4'時,我認爲它應該是100,因爲這是我在主要版本中創建的緩衝區的大小。 輸出: 緩衝區大小:100 的sizeof(緩衝液):4將char緩衝區傳遞給函數並獲取緩衝區的大小

#include <string.h> 
#include <stdio.h> 

void load_buffer(char *buffer); 

int main() 
{ 
    char buffer[100]; 
    printf("buffer size: %d\n", sizeof(buffer)); 
    load_buffer(buffer); 

    return 0; 
} 

void load_buffer(char *buffer) 
{ 
    printf("sizeof(buffer): %d\n", sizeof(buffer)); 
} 
+2

在main()中顯式聲明瞭一個數組,而在load_buffer()中聲明瞭一個指針。不同之處在於,在main()中,編譯器知道緩衝區是一個數組,但是在load_buffer()中,編譯器不知道緩衝區是來自數組,還是堆中分配的內存和結構或其他。編譯器只知道內存地址(因此是一個指針),所以sizeof()返回內存地址的大小,它的長度是4個字節(因爲它是一個32位的機器,如果它是一個64位的機器,它將是8字節長)。希望這有助於理解更多。 – AndaluZ 2014-04-01 12:15:53

+0

而不是sizeof()函數,使用strlen(),然後它返回指針值的大小。 – NandhaKumar 2018-01-05 06:18:47

回答

19

您正在使用指針的大小到緩衝區(4個字節),而不是緩衝區的大小。

在C中,您必須分別傳遞緩衝區的大小,這是緩衝區溢出發生的原因之一。

void load_buffer(char * buffer, size_t bufSize) 
{  
    ... 
} 
4

會發生什麼事,就是當你傳遞一個數組給一個函數,你只能通過數組的地址在內存中,數組的不是大小。在load_buffer()中輸出的sizeof(buffer)是指針的大小,它是四個字節。

保持功能的緩衝區的大小,最好的辦法是改變功能:

void load_buffer(char *buffer, int length); 

和調用:

load_buffer(buffer, sizeof(buffer)); 

,然後使用長度,每當你想緩衝區的大小。

8

從OP

void load_buffer(char *buffer) 
{ 
    printf("sizeof(buffer): %d\n", sizeof(buffer)); 
} 

即使你可以想象load_buffer()是通過buffer通過refrence,究竟發生什麼事是你被值指針傳遞到char實際的數組沒有通過所以load_buffer()函數沒有辦法知道緩衝區的大小

那麼sizeof(buffer)在做什麼?它只是返回一個指向char的指針的大小。如果load_buffer()需要buffer的大小,則需要通過快速傳遞。

或對結構相反,您可以創建包含一個字符數組,數組的大小的新結構,並通過一個指針,這樣的緩衝和它的大小永遠在一起;)

20

的Mitch Wheat和hhafez的答案完全正確並且重要。我將展示一些有時可能有用的附加信息。

請注意,如果你告訴編譯器,你有合適的尺寸

void load_buffer(char buffer[100]) { 
    /* prints 4 too! */ 
    printf("sizeof(buffer): %d\n", sizeof(buffer)); 
} 

爲參數數組只是聲明一個指針數組同樣的情況。即使它被聲明爲char name[N],編譯器也會自動將其更改爲char *name

如果要強制調用者只傳遞大小爲100的數組,可以接受的陣列,而不是地址(以及該類型):

void load_buffer(char (*buffer)[100]) { 
    /* prints 100 */ 
    printf("sizeof(buffer): %d\n", sizeof(*buffer)); 
} 

這是一個指向數組你有主,所以你需要在函數中取消引用來獲取數組。索引然後被

buffer[0][N] or (*buffer)[N] 

沒有人知道我是這樣做,我也不做我自己做的,因爲它比較複雜的論證通過。但知道這件事很好。您可以調用函數這樣便

load_buffer(&buffer) 

如果你想接受其他尺寸太大,我會與過去的-N選擇其他兩個答案建議去。