修改作为指针传递的缓冲区

时间:2013-12-14 22:36:04

标签: c pointers malloc memcpy

我正在尝试读入作为指向此函数的指针传递的缓冲区。 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;
}

2 个答案:

答案 0 :(得分:2)

您无法直接修改buffer,因为C使用带参数的值传递值。因此,它是您正在修改的指针的副本。要更改指针,您需要更改函数原型以获取char**并分配到第一级间接。

作为一个粗略的例子:

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 :(得分:2)

问题很简单:你正在修改变量“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;
}

调用函数:

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