如果 src 数组不包含一个,我想知道 strdup 是否在新数组的末尾添加一个 '\0' ?
假设我们有一个包含由这种 malloc 分配的“hello”的数组
malloc(sizeof(char) * 5);
所以 5 个字节对应 5 个字符。
我猜 src 字符串没有为 '\0' 接收到足够的内存。
在这种情况下应该发生什么?
首先是标准的免责声明:strdup
不是一个标准化的函数,所以它的确切作用可能(至少在理论上)因编译器而异。也就是说,我看到的每个实现都以相同的方式工作。
strdup
将确定输入字符串的长度——它将从您传递的指针中的地址开始,并在该位置之后找到第一个 NUL 字节。然后它将分配一个新的内存块并将该范围内的字节复制到新分配的块中。
所以会发生两件事之一。输入将包含一个零字节,结果也将包含,否则strdup
将读取您传递的输入的末尾,您将获得未定义的行为(但很有可能它最终会找到一个零字节,并将一堆额外的垃圾复制到重复的字符串中)。
另一个小注意事项:如果您使用strdup
,然后尝试将您的代码移植到未定义它的编译器,您可能会考虑编写自己的:
char *strdup(char const *s) {
size_t len = strlen(s) + 1;
char *ret = malloc(len);
if (ret != NULL)
strcpy(ret, s);
return ret;
}
这显然是一件很容易做到的事情,但它还有另一个问题:在代码中包含它会产生未定义的行为。您不能编写名称以 . 开头的函数str
。这些都是为实现而保留的。因此,即使该函数很简单并且其内容的行为被完美地定义,该函数作为一个整体的存在仍然会产生未定义的行为。
在这种情况下,strdup() 会做的是从传递的字符串开始,然后继续查看内存,直到它掉出分配内存的末尾(并且你得到一个 SIGSEGV 或类似的),或者找到一个恰好包含的字节'\0'。
它将分配足够的内存来包含它扫描的所有内容的副本,包括“\0”,然后复制所有内容。