2013-12-14 71 views
0

我試圖讀入一個作爲指向這個函數的指針傳遞的緩衝區。 memcpy()工作正常,數據正確存儲在buffer,但是當我訪問buffer以外的功能是null。有一些指針問題,我沒有在這裏。修改緩衝區作爲指針傳遞

下面是代碼,我拿出了大部分代碼,我知道它會正確複製數據,但它不會將它傳遞給buffer指針。想法?

int read(file file, char *buffer , int maxlen) { 
    int bytes_read; 

    // copy data to file buffer 
    bytes_read = min(maxlen, file->file_size - file->cursor); 
    buffer = (char*) malloc(bytes_read); 

    memcpy(buffer , file->buffer + file->cursor, bytes_read); 

    return bytes_read; 
} 
+1

你需要一個char **緩存通過。 – OldProgrammer

+0

正如@OldProgrammer所指出的那樣,你實際上並沒有將一個引用傳遞給緩衝區 - 你將一個引用傳遞給單個字符。 – reuben

+0

@reuben不,他正在傳遞一個指針。 C. – 2013-12-14 22:40:57

回答

1

您不能直接修改buffer,因爲C使用按值傳遞參數。因此它是您正在修改的指針的副本。要改變指針,你需要改變你的函數原型,並將其分配給第一級間接尋址。

由於這是一種拙劣例如:

void read(char** buffer , int byte_size) { 
    *buffer = (char*) malloc(byte_size); 
} 

,並使用其中的東西需要像

char* buffer; 
read(&buffer,10); /* now buffer points to dynamically allocated array of 10 chars */ 
1

的問題很簡單:你要修改的變量「緩衝」。由於它是通過值而不是通過引用傳遞的,因此調用函數看不到更改。爲了使緩衝區變爲可見,你需要傳遞一個指向緩衝區的指針。然後

你的功能應該是這樣的:

int read(file file, char **buffer , int maxlen) { 
    int bytes_read; 

    // copy data to file buffer 
    bytes_read = min(maxlen, file->file_size - file->cursor); 
    *buffer = (char*) malloc(bytes_read); 

    memcpy(*buffer , file->buffer + file->cursor, bytes_read); 

    return bytes_read; 
} 

調用的函數:

rv = read(file, &buffer, maxlen);