#inlcude <stdio.h>
#inlcude <stdlib.h>
#inlcude <string.h>
int main() {
char *buff = (char*)malloc(sizeof(char) * 5);
char *str = "abcdefghijklmnopqrstuvwxyz";
memcpy (buff, str, strlen(str));
while(*buff) {
printf("%c" , *buff++);
}
printf("\n");
return 0;
}
这段代码打印了整个字符串 "abc...xyz",但 "buff "没有足够的内存来容纳这个字符串。 memcpy()是如何工作的? 它是否使用realloc()?
你的代码有 未定义的行为. 回答你的问题 没有, memcpy
不用 realloc
.sizeof(buf)
应足以容纳 strlen(str)
. 少了就会崩溃。
由于是小程序,输出可能会被打印出来,但在真正的大代码中会造成难以调试的错误。把你的代码改成。
const char* const str = "abcdefghijklmnopqrstuvwxyz";
char* const buff = (char*)malloc(strlen(str) + 1);
还有,不要做 *buff++
因为你会丢失内存记录(你分配的)。在 malloc()
该做 free(buff)
一旦内存使用结束,否则就是内存泄漏。
你可能会把整个字符串打印出来,但这是不安全的,你正在向未分配的内存写入和读取。这就会产生Undefined Behavior。
memcpy
不做任何内存分配。它只是从你提供的位置读取和写入。它并不检查这样做是否正常,在这种情况下,你的程序不崩溃就很幸运了。
memcpy()是如何工作的?
因为你调用了未定义的行为。未定义的行为可能完全按照你的期望工作,也可能做一些完全不同的事情。它甚至可能在同一程序的不同运行中有所不同。它也可能会格式化你的硬盘,并且仍然符合标准(当然这不太可能 :P )
未定义的行为意味着该行为从字面上看并没有被定义为做任何事情。任何事情都是有效的,包括你看到的行为。请注意,如果您尝试 free
你的目标平台的C运行时可能会抱怨。)
;) memcpy
不使用 malloc
. 正如你所猜测的那样,你正在写下的结束。buff
. 在你的简单例子中,这不会造成明显的伤害,但它是坏的。 下面是一些在 "真实 "程序中可能出错的事情。
buff
导致以后出现微妙(或不那么微妙)的错误。malloc
和 free
,导致下一次调用这些函数时出现崩溃或其他问题。有以下几种情况 malloc
实现将未映射的守卫页放在分配的内存周围,(通常)会在这种情况下导致程序崩溃。 其他的实现会检测到这一点,但只是在你下一次调用到 malloc
或 free
(或者当你调用一个特殊函数来检查堆时)。