我对以下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:?
答案 0 :(得分:2)
正确答案是2& 5。
#2
因为内存分配函数可能会失败,您必须检查它们的返回值。
#5
因为,除非你记录了你的函数动态分配返回缓冲区调用者的事实,否则无法知道它们必须释放返回的缓冲区。
#1
不正确,因为你正确地说calloc
分配了NULL
终止所需的字符串+额外字节所需的内存。
#3
不正确,因为它不是真的,memcpy
只是将数据从源复制到目标。它不受存储在该存储器中的内容的影响。
#4
不正确,因为calloc
将已分配的内存清零。