繁体   English   中英

将 char** 转换为 char* 或 char

[英]converting char** to char* or char

我有一个旧程序,其中使用了一些库 function,但我没有那个库。

所以我正在使用 c++ 库编写该程序。 在那个旧代码中,有一些 function 是这样调用的

*string = newstrdup("这里有一些字符串");

字符串变量被声明为 char **string;

他在名为“newstrdup”的 function 中可能在做什么? 我尝试了很多东西,但我不知道他在做什么......谁能帮忙

function 用于制作 c 字符串的副本。 这通常是获取字符串文字的可写版本所必需的。 它们(字符串文字)本身是不可写的,因此这样的 function 将它们复制到分配的可写缓冲区中。 然后,您可以将它们传递给修改其给定参数的函数,例如strtok写入它必须标记的字符串。

我认为你可以想出这样的东西,因为它被称为new strdup

char * newstrdup(char const* str) {
    char *c = new char[std::strlen(str) + 1];
    std::strcpy(c, str);
    return c;
}

使用字符串完成后,您应该释放它

delete[] *string;

另一种编写方法是使用malloc 如果库是旧的,它可能已经使用了,C++ 继承自 C:

char * newstrdup(char const* str) {
    char *c = (char*) malloc(std::strlen(str) + 1);
    if(c != NULL) {
        std::strcpy(c, str);
    }
    return c;
}

现在,您应该在完成后使用free释放字符串:

free(*string);

如果您使用 C++ 编写,则首选第一个版本。 但如果现有代码再次使用free释放 memory,请使用第二个版本。 请注意,如果没有 memory 可用于复制字符串,则第二个版本返回NULL ,而第一个版本在这种情况下会引发异常。 NULL参数传递给newstrdup时,应注意有关行为的另一条注释。 取决于您的图书馆,可能允许或不允许。 因此,如有必要,请在上述函数中插入适当的检查。 There is a function called strdup available in POSIX systems, but that one allows neither NULL arguments nor does it use the C++ operator new to allocate memory.

无论如何,我用谷歌代码搜索来寻找newstrdup函数,发现了很多。 也许您的图书馆是其中的结果:

谷歌代码搜索,newstrdup

他们编写了一个“新”版本的 strdup 肯定是有原因的。 所以必须有一个角落案例,它以不同的方式处理。 就像 null 字符串返回一个空字符串一样。

litb 的答案是strdup的替代品,但我认为他们这样做是有原因的。

如果要直接使用 strdup,请使用定义来重命名它,而不是编写新代码。

*string = newstrdup("Some string goes here"); newstrdup没有任何奇怪之处。 如果string的类型为char ** ,则newstrdup只是按预期返回char * 大概string已经被设置为指向一个char *类型的变量,结果将被放置在其中。 否则代码正在通过未初始化的指针写入..

newstrdup 可能正在创建一个与传递的字符串重复的新字符串; 它返回一个指向字符串的指针(它本身就是一个指向字符的指针)。

看起来他编写了一个 strdup() function 来对现有指针进行操作,可能是将其重新分配到新的大小,然后填充其内容。 很可能,他这样做是为了在循环中重复使用相同的指针,其中 *string 将频繁更改,同时防止每次后续调用 strdup() 时发生泄漏。

我可能会像 string = redup(&string, "new contents").. 那样实现它,但这只是我。

编辑

这是我的“redup” function 的片段,它可能与您发布的内容类似,只是方式不同:

int redup(char **s1, const char *s2)
{
    size_t len, size;

    if (s2 == NULL)
        return -1;

    len = strlen(s2);
    size = len + 1;

    *s1 = realloc(*s1, size);

    if (*s1 == NULL)
        return -1;

    memset(*s1, 0, size);
    memcpy(*s1, s2, len);

    return len;
}

当然,如果 realloc() 失败,我可能应该保存 *s1 的副本并恢复它,但我不需要那么偏执。

我认为您需要查看代码中的“字符串”变量发生了什么,因为 newstrdup() function 的原型似乎与库 strdup() 版本相同。

代码中是否有任何 free(*string) 调用?

这似乎是一件奇怪的事情,除非它在内部保留重复字符串的副本并再次返回指向同一字符串的指针。

再次,我会问为什么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM