C 将字符**转换为字符*或字符

C 将字符**转换为字符*或字符,c,pointers,char,c-strings,C,Pointers,Char,C Strings,我有一个旧程序,其中使用了一些库函数,但我没有那个库 所以我用C++库编写了这个程序。 在那段旧代码中,有一个函数被这样调用 *string=newstrdup(“这里有一些字符串”) 字符串变量声明为char**string 他在名为“newstrdup”的函数中可能在做什么? 我尝试了很多事情,但我不知道他在做什么。。。有人能帮忙吗newstrdup可能正在生成一个新字符串,该字符串与传递的字符串重复;它返回一个指向字符串的指针(该指针本身就是指向字符的指针)。newstrdup可能正在生成

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

所以我用C++库编写了这个程序。 在那段旧代码中,有一个函数被这样调用

*string=newstrdup(“这里有一些字符串”)

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

他在名为“newstrdup”的函数中可能在做什么?
我尝试了很多事情,但我不知道他在做什么。。。有人能帮忙吗

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

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

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

我可能会实现类似string=redup(&string,“newcontents”)。。但那只是我

编辑

下面是我的“redup”功能的一个片段,它可能会以不同的方式执行与您发布的类似的操作:

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的一个副本并将其还原,但我不需要那么多疑。

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

我可能会实现类似string=redup(&string,“newcontents”)。。但那只是我

编辑

下面是我的“redup”功能的一个片段,它可能会以不同的方式执行与您发布的类似的操作:

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的一个副本并将其还原,但我不需要那么多疑。

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

我想你可以想出这样的东西,因为它被称为newstrdup:

您应该在使用字符串完成后使用

delete[] *string;
另一种编写方法是使用
malloc
。如果库是旧的,它可能已经使用了C++,它继承了C:< /P>
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
再次释放内存,请使用第二个版本。注意,如果没有内存可用于复制字符串,则第二个版本返回
NULL
,而第一个版本在这种情况下抛出异常。当您将
NULL
参数传递给
newstrdup
时,应注意另一个行为。这取决于您的库,可能允许也可能不允许。因此,如有必要,在上述函数中插入适当的检查。POSIX系统中有一个名为
strdup
的函数,但该函数既不允许
NULL
参数,也不使用
C++
运算符new分配内存

不管怎样,我用谷歌代码搜索搜索了
newstrdup
函数,找到了不少。也许您的库是结果之一:


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

我想你可以想出这样的东西,因为它被称为newstrdup:

您应该在使用字符串完成后使用

delete[] *string;
另一种编写方法是使用
malloc
。如果库是旧的,它可能已经使用了C++,它继承了C:< /P>
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
再次释放内存,请使用第二个版本。注意,如果没有内存可用于复制字符串,则第二个版本返回
NULL
,而第一个版本在这种情况下抛出异常。当您将
NULL
参数传递给
newstrdup
时,应注意另一个行为。这取决于您的库,可能允许也可能不允许。因此,如有必要,在上述函数中插入适当的检查。POSIX系统中有一个名为
strdup
的函数,但该函数既不允许
NULL
参数,也不使用
C++
运算符new分配内存

不管怎样,我用谷歌代码搜索搜索了
newstrdup
函数,找到了不少。也许您的库是结果之一:


我认为您需要查看代码中“string”变量的情况,因为newstrdup()函数的原型似乎与库strdup()版本相同

代码中是否有任何空闲(*字符串)调用

它是w