我对以下 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 memcpy() 如果用于复制 ASCII 字符串,可能会损坏数据。
4 buf 永远不会以 NUL 结尾,因此不能被影响字符串的 C 库函数使用。
5 函数返回一个指向动态内存的指针。应该避免这种做法,并且总是会造成内存泄漏。
我认为正确答案是 2,但这更多是因为其他答案对我来说似乎不正确,而不是因为答案 2 是直接正确的答案。
答案 1 似乎不正确,因为 calloc 保留了足够的内存 (len+1) 来适当地结束字符串,
我对答案 3 中的内容一无所知,
answer4:memcpy 将 s 的内容复制到 buf 留下最后一个字节等于 0(复制 len 个字节,注意 previos 调用 calloc 用 0 填充最后一个字节)。因此,这个答案是不正确的,
答案5:?
你怎么看?提前致谢...