strdup() – 它在C中做什么?
在C中的strdup()
函数的目的是什么?
确切地说,它听起来像(假设你习惯于C和UNIX分配单词的缩写方式),它会复制string 。
记住它实际上不是ISO C标准本身的一部分(这是一个POSIX的东西),它的效果和下面的代码一样:
char *strdup (const char *s) { char *d = malloc (strlen (s) + 1); // Space for length plus nul if (d == NULL) return NULL; // No memory strcpy (d,s); // Copy the characters return d; // Return the new string }
换一种说法:
- 它试图分配足够的内存来保存旧string(加上一个空字符来标记string的末尾)。
- 如果分配失败,它将
errno
为ENOMEM
并立即返回NULL
(将errno
为ENOMEM
是malloc
所做的事情,所以我们不需要在我们的strdup
明确地执行它)。 - 否则,分配工作,所以我们复制旧的string到新的string,并返回新的地址(调用者负责释放在某个时刻)。
请记住这是概念上的定义。 任何值得他们工资的图书馆作者都可能提供了针对特定处理器的大量优化的代码。
如果你是憎恶函数中多个出口点的人群的一部分(我不这样做,除非它影响到可读性,我不认为是这样一个简短函数的情况),你可以写代码为:
char *strdup (const char *s) { char *d = malloc (strlen (s) + 1); // Allocate memory if (d != NULL) strcpy (d,s); // Copy string if okay return d; // Return new memory }
char * strdup(const char * s) { size_t len = 1+strlen(s); char *p = malloc(len); return p ? memcpy(p, s, len) : NULL; }
也许代码比strcpy()
快一点,因为\0
char不需要再次search(它已经用strlen()
)。
没有重复其他答案的要点,但请注意, strdup()
可以从C的angular度做任何事情,因为它不是任何C标准的一部分。 然而,它由POSIX.1-2001定义。
从strdup男人 :
strdup()
函数将返回一个指向新string的指针,该string是s1
指向的string的副本。 返回的指针可以传递给free()
。 如果无法创build新string,则返回空指针。
它通过运行malloc和strcpy传入的string来传入的string的副本。malloc的缓冲区返回给调用者,因此需要在返回值上运行free 。
strdup()为包含结尾字符'\ 0'的字符数组分配dynamic内存,并返回堆内存的地址:
char *strdup (const char *s) { char *p = malloc (strlen (s) + 1); // allocate memory if (p != NULL) strcpy (p,s); // copy string return p; // return the memory }
所以,它所做的是给我们另一个string相同的参数给出的string,而不需要我们分配内存。 但是我们以后还是需要解放它。
它所做的最有价值的事情是给你另一个与第一个string相同的string,而不要求你自己分配内存(位置和大小)。 但是,如上所述,您仍然需要释放它(但不要求数量计算)。
strdup()函数是string重复的简写forms,它将参数作为string常量或string常量,并为该string分配足够的空间,并将相应的字符写入分配的空间,最后返回分配的地址空间到调用例程。
strdup()函数为stringstr的副本分配足够的内存,进行复制并返回指向它的指针。
指针可能随后被用作自由函数(3)的参数。
如果内存不足,则返回NULL,并将errno设置为ENOMEM。
strndup()函数复制stringstr中的最多len个字符,总是NULL,终止复制的string。
这是简单的strcpy(ptr2, ptr1)
相当于while(*ptr2++ = *ptr1++)
其中as: strdup相当于
ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);
所以,如果你想要复制的string在另一个函数中使用(因为它是在堆部分创build的),你可以使用strdup,否则strcpy就足够了