我如何使用strdup?

时间:2013-02-19 00:30:49

标签: c malloc strdup

我正在调用strdup并且必须在调用strdup之前为变量分配空间。

char *variable;
variable = (char*) malloc(sizeof(char*));
variable = strdup(word);

我这样做了吗?或者这里有什么问题吗?

4 个答案:

答案 0 :(得分:21)

如果您正在使用POSIX标准strdup(),它会计算所需的空间并分配它并将源字符串复制到新分配的空间中。你自己不需要做malloc();实际上,如果你这样做会立即泄漏,因为你用指向strdup()分配的空间的指针覆盖你指定空间的唯一指针。

因此:

char *variable = strdup(word);
if (variable == 0) …process out of memory error; do not continue…
…use variable…
free(variable);

如果确实需要进行内存分配,则需要在strlen(word)+1中分配variable个字节,然后可以将word复制到新分配的空间中。

char *variable = malloc(strlen(word)+1);
if (variable == 0) …process out of memory error; do not continue…
strcpy(variable, word);
…use variable…
free(variable);

或计算一次长度并使用memmove()memcpy()

size_t len = strlen(word) + 1;
char *variable = malloc(len);
if (variable == 0) …process out of memory error; do not continue…
memmove(variable, word, len);
…use variable…
free(variable);

不要忘记确保您知道每free() malloc()的位置。

答案 1 :(得分:9)

你不需要为strdup分配空间,strdup会为你做这件事。但是你应该在使用后释放它。

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int main (){

    const char* s1= "Hello World";
    char* new = strdup (s1);
    assert (new != NULL);

    fprintf( stdout , "%s\n", new);

    free (new);
    return 0;
}

编辑:小心使用C ++,因为变量名new在C中很好,而不是在C ++中,因为它是operator new的保留名称。

答案 2 :(得分:6)

你好像很困惑。忘掉你对指针的了解。让我们使用整数。

int x;
x = rand();    // Let us consider this the "old value" of x
x = getchar(); // Let us consider this the "new value" of x

我们有什么方法可以检索旧值,还是从我们的视角“泄露”?作为一个假设,假设您希望操作系统知道您已完成该随机数,以便操作系统执行一些清理任务。

生成新值需要旧值吗?当getchar看不到x?

时怎么可能呢?

现在让我们考虑您的代码:

char *variable;
variable = (char*) malloc(sizeof(char*)); // Let us consider this the "old value" of variable
variable = strdup(word);                  // Let us consider this the "new value" of variable

我们有什么方法可以检索旧值,还是从我们的视角“泄露”?通过调用malloc,您应该在完成free(variable);内存时让操作系统知道。

生成新值需要旧值吗?怎么可能,strdup看不到变量?

仅供参考,这是一个如何实施strdup的例子:

char *strdup(const char *original) {
    char *duplicate = malloc(strlen(original) + 1);
    if (duplicate == NULL) { return NULL; }

    strcpy(duplicate, original);
    return duplicate;
}

答案 3 :(得分:2)

目前看来,你总是泄漏4到8个字节(取决于你的架构)。无论strdup哪个will allocate the required dynamic memory on its own你正在重新分配保存指向新malloced内存区域的指针的唯一变量。

简单地说

char* const variable = strdup(word);