gpt4 book ai didi

c - 从字符串复制到分配的内存的函数中的运行时错误

转载 作者:太空宇宙 更新时间:2023-11-04 02:58:57 25 4
gpt4 key购买 nike

我对以下 C 谜题有一些想法。我很好奇更多有经验的 C 程序员可能会想到什么......看看示例代码:

char * strdup (const char * s) { 
char * buf;
int len;
assert(s != NULL);
len = strlen(s);
buf = (char *) calloc(len + 1, sizeof(char));
memcpy(buf, s, len);
return buf;
}

上面建议的 strdup() 实现包含一个运行时错误,该错误可能不会与每次调用一致地出现。以下哪一项准确描述了此错误?

这个问题的可能答案是:

1 calloc() 的参数不会导致分配足够的内存来存储 s 的内容。

2 如果内存不足,calloc() 可能会失败并返回 NULL。代码没有预料到这种情况。

3 如果用于复制 ASCII 字符串,memcpy() 可能会损坏数据。

4 buf 永远不会以 NUL 结尾,因此不能被影响字符串的 C 库函数使用。

5 该函数返回指向动态内存的指针。这种做法应该避免,并且总是构成内存泄漏。

我的想法是正确答案是 2,但这更多是因为其他答案对我来说似乎不正确,而不是因为答案 2 是最直接的正确答案。

  • 答案 1 似乎不正确,因为 calloc 保留了足够的内存 (len+1) 来适本地结束字符串,

  • 我对答案3的内容一无所知,

  • answer4:memcpy 将 s 的内容复制到 buf 并使最后一个字节等于 0(复制 len 个字节,请注意,之前对 calloc 的调用用 0 填充了最后一个字节)。因此,这个答案是不正确的,

  • 回答 5: ?

你怎么看?提前致谢...

最佳答案

正确答案是 2 和 5。

#2 因为内存分配函数可能会失败,您必须检查它们的返回值。

#5 因为,除非您记录了您的函数动态分配返回缓冲区这一事实,否则调用者无法知道他们必须释放返回缓冲区。

#1 是不正确的,因为正如您所说的那样,calloc 分配字符串所需的内存 + NULL 终止所需的额外字节。

#3 不正确,因为它不是真的,memcpy 只是将数据从源复制到目标。它不受内存中存储内容的影响。

#4 不正确,因为 calloc 将分配的内存归零。

关于c - 从字符串复制到分配的内存的函数中的运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14280028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com