12

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

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

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

4

4 回答 4

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().

于 2013-02-19T00:35:16.550 回答
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++ 中则不行,因为它是运算符 new 的保留名称。

于 2013-02-19T00:44:25.497 回答
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;
}
于 2013-02-19T01:18:35.100 回答
2

就目前而言,您总是会泄漏 4 到 8 个字节(取决于您的架构)。无论strdup哪个会自行分配所需的动态内存,您都在重新分配唯一的变量来保存指向新分配的内存区域的指针。

简单地说

char* const variable = strdup(word);
于 2013-02-19T00:38:22.403 回答