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

时间:2013-01-11 14:19:40

标签: c memcpy strlen calloc

我对以下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。代码没有预料到这种情况。

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

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

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

我认为正确答案是2 ,但更多是因为其他答案对我来说似乎不正确,因为答案2是直接答案。

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

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

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

  • 回答5:?

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

1 个答案:

答案 0 :(得分:2)

正确答案是2& 5。

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

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

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

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

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