-2

代码编辑:https ://gcc.godbolt.org/z/x3hnj46WY

场景 -1 试图通过引用(或指针)传递原始指针无法使用 & 将 get() 的值传递给 setBuffer() // 编译错误:lvalue required as unary '&' 操作数

场景 -2 通过获取原始字符指针分配值返回 使用 & 将字符指针传递给 setBuffer()

注意:setBuffer() 存在于 C 库中我正在使用此 API https://www.libssh2.org/libssh2_session_last_error.html来获取 errmsg,而不是使用 char 数组缓冲区,我想使用 char 数组的智能指针。

#include <string.h>
#include <iostream>
#include <memory>

int setBuffer(char ** ptr) {
    // ASSUMPTION: *ptr has sufficient memory to store copied data
    strcpy(*ptr, "sample string"); 
    return 0;
}
 
int main()
{
    std::unique_ptr<char []> lup = std::make_unique<char []>(1024);
    memset(lup.get(), 0 , 1024);
    
    strcpy(lup.get(), "sample string - 1");
    std::cout << lup << '\n';                   // c++20
   
    // SCENARIO - 1 | Compilation error
    setBuffer(&lup.get());  // CE: lvalue required as unary '&' operand
    
    // SCENARIO - 2 | Works fine
    char * lp = lup.get();
    setBuffer(&lp);
    
    std::cout << lup << '\n';                   // c++20
    
    return 0;
}
4

1 回答 1

1

根据文档:

errmsg - 如果不为 NULL,则通过引用填充最新错误消息的人类可读形式。

我的阅读是它不会将任何错误消息复制到给定的缓冲区,只会将指针设置为存储在会话对象中的缓冲区(包含错误消息)。

因此用法如下所示:

char* errmsg = nullptr;
int errmsg_len = 0;
int ec = libssh2_session_last_error(session, &errmsg, &errmsg_len, /*want_buf=*/ 0);

printf("%s\n", errmsg);

另一方面,如果 want_buf 设置为非零值,则会分配一个新的缓冲区,调用者负责free稍后调用它。

于 2021-09-13T06:50:08.750 回答