c语言 - strdup 在复制字符数组时是否添加了''?



如果src数组不包含"\0",我想知道strdup是否在新数组的末尾添加"\0"?

假设我们有一个包含"hello"的数组,由这种malloc 分配

malloc(sizeof(char) * 5);

因此5个字节对应5个字符。

我猜src字符串没有接收到足够的内存用于"\0"。

在这种情况下应该发生什么?

首先是标准免责声明:strdup不是一个标准化的函数,所以它的具体功能(至少在理论上)可能因编译器而异。也就是说,我看到的每一个实现都以相同的方式工作。

strdup将确定输入字符串的长度——它将从您传递的指针中的地址开始,并找到该位置之后的第一个NUL字节。然后,它将分配一个新的内存块,并将该范围内的字节复制到新分配的块中。

因此,两件事中的一件将会发生。要么输入将包含一个零字节,结果也将包含,要么strdup将读取超过您传递的输入的末尾,您将得到未定义的行为(但很有可能它最终会找到一个0字节,并将一堆额外的垃圾复制到重复的字符串中)。

另一个小注意事项是:如果您使用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",然后复制所有内容。

最新更新