c-如何使用strdup



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

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

我这样做对吗?还是这里出了什么问题?

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

因此:

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

如果确实需要进行内存分配,则需要在variable中分配strlen(word)+1字节,然后可以将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);

不要忘记确保您知道每个malloc()free()在哪里。

您不需要分配空间与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 , "%sn", new);
    free (new);
    return 0;
}

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

你看起来很困惑。忘记你对指针的了解。让我们使用int。

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 ed内存时,您需要通过调用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;
}

目前的情况是,您总是泄漏4到8个字节(取决于您的体系结构)。不管strdup将自行分配所需的动态内存,您都将重新分配唯一一个变量,该变量将指针指向新分配的内存区域。

简单地说

char* const variable = strdup(word);

相关内容

  • 没有找到相关文章

最新更新