【问题标题】:Modify buffer passed as a pointer修改作为指针传递的缓冲区
【发布时间】:2014-01-02 13:15:37
【问题描述】:

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

【问题讨论】:

  • 你需要传入一个 char** 缓冲区。
  • 正如@OldProgrammer 所指出的,您实际上并没有传递对缓冲区的引用——您传递的是对单个字符的引用。
  • @reuben 不,他正在传递一个指针。 C 中没有引用。
  • @H2CO3 是的,我明白这一点。 “通过引用传递”是一个有效且受人尊敬的术语,即使在 C 中也是如此。我在抽象的引用意义上使用这个术语更宽松。

标签: c pointers malloc memcpy


【解决方案1】:

您不能直接修改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 */

【讨论】:

    【解决方案2】:

    问题很简单:您正在修改变量“缓冲区”。由于它是按值而不是按引用传递的,因此调用函数看不到更改。为了使对缓冲区的更改可见,您需要传入一个指向缓冲区的指针。

    您的函数将如下所示:

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多