指针与缓冲区的双指针

cod*_*oet 1 c pointers

我有一种情况,我在内存中有一个大字符串,我想用函数提供这个片段(例如,从30开始给我14个字符串运行).为了使这项工作,我不得不让消费者使用双指针作为他们的缓冲区.

void foo(char** bar)
{
    char* tmp = "nope";
    *bar = &tmp[1];
}

int main (int argc, char const *argv[])
{
    char* baz = "yep";
    foo(&baz);
    printf("%s", baz);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我查看pread或strcpy等各种库函数,它们只接受一个指针级别的字符串缓冲区.

他们是怎么做到的?看起来他们应该需要一个双指针以同样的方式更改"另一边"的值.

unw*_*ind 6

大多数此类函数不会更改指针,它们会更改内存.原型strcpy()是:

char * strcpy(char *dest, const char *source);
Run Code Online (Sandbox Code Playgroud)

这意味着指向的内存dest将被内容覆盖source,直到(并包括)找到第一个0字符.

调用者将使用要修改的缓冲区的地址调用它.

对于你的情况,听起来你是在零复制字符串切片之后,然后使用指针指针更有意义.请注意,终止将成为一个问题,您无法复制C字符串而无需复制,否则原始也将被切片.

您当然可以定义复制字符串切片功能:

char * slice_string(char *dest, size_t dest_max,
                    const char *source, int start_index, int end_index);
Run Code Online (Sandbox Code Playgroud)

这将从字符复制sourcedest,只是喜欢strcpy(),但只复制子串.我做了索引签名,所以你可以支持负索引,例如Python.

请注意,不会调用strslice()该函数,因为该函数名称是保留的.