1

我对以下 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:?

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

4

1 回答 1

2

正确答案是 2 和 5。

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

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

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

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

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

于 2013-01-11T14:25:37.670 回答