memcpy()是否使用了realloc()?

问题描述 投票:5回答:4
#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()?

c buffer memcpy realloc
4个回答
11
投票

你的代码有 未定义的行为. 回答你的问题 没有, memcpy 不用 realloc.sizeof(buf) 应足以容纳 strlen(str). 少了就会崩溃。

由于是小程序,输出可能会被打印出来,但在真正的大代码中会造成难以调试的错误。把你的代码改成。

const char* const str = "abcdefghijklmnopqrstuvwxyz";
char* const buff = (char*)malloc(strlen(str) + 1);

还有,不要做 *buff++ 因为你会丢失内存记录(你分配的)。在 malloc() 该做 free(buff) 一旦内存使用结束,否则就是内存泄漏。


8
投票

你可能会把整个字符串打印出来,但这是不安全的,你正在向未分配的内存写入和读取。这就会产生Undefined Behavior。

memcpy 不做任何内存分配。它只是从你提供的位置读取和写入。它并不检查这样做是否正常,在这种情况下,你的程序不崩溃就很幸运了。


1
投票

memcpy()是如何工作的?

因为你调用了未定义的行为。未定义的行为可能完全按照你的期望工作,也可能做一些完全不同的事情。它甚至可能在同一程序的不同运行中有所不同。它也可能会格式化你的硬盘,并且仍然符合标准(当然这不太可能 :P )

未定义的行为意味着该行为从字面上看并没有被定义为做任何事情。任何事情都是有效的,包括你看到的行为。请注意,如果您尝试 free 你的目标平台的C运行时可能会抱怨。)


1
投票

;) memcpy 不使用 malloc. 正如你所猜测的那样,你正在写下的结束。buff. 在你的简单例子中,这不会造成明显的伤害,但它是坏的。 下面是一些在 "真实 "程序中可能出错的事情。

  • 你可能会在你的程序后的内存里乱涂乱画的。buff 导致以后出现微妙(或不那么微妙)的错误。
  • 你可能会在内部使用的头文件上乱涂乱画。mallocfree,导致下一次调用这些函数时出现崩溃或其他问题。
  • 你可能最终会写到一个没有分配给你的进程的地址,在这种情况下,你的程序会立即崩溃。 (我怀疑这是你所期望的。)

有以下几种情况 malloc 实现将未映射的守卫页放在分配的内存周围,(通常)会在这种情况下导致程序崩溃。 其他的实现会检测到这一点,但只是在你下一次调用到 mallocfree (或者当你调用一个特殊函数来检查堆时)。

© www.soinside.com 2019 - 2024. All rights reserved.