memcpy()是否使用realloc()?

时间:2011-05-23 04:40:54

标签: c buffer memcpy realloc

#inlcude <stdio.h>
#inlcude <stdlib.h>
#inlcude <string.h>

int main() {
    char *buff = (char*)malloc(sizeof(char) * 5);
    char *str = "abcdefghijklmnopqrstuvwxyz";

    memcpy (buff, name, strlen(str));

    while(*buff) {
        printf("%c" , *buff++);
    }

    printf("\n");

    return 0;
}

此代码打印整个字符串“abc ... xyz”。但是“buff”没有足够的内存来容纳那个字符串。 memcpy()如何工作?它是否使用realloc()?

4 个答案:

答案 0 :(得分:10)

您的代码有未定义的行为。要回答您的问题,memcpy不会使用reallocsizeof(buf)应该足以容纳strlen(str)。更少的是崩溃。

输出可能是打印的,因为它是一个小程序,但在真正的大代码中,它将导致难以调试错误。将您的代码更改为,

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

此外,不要执行*buff++因为您将丢失内存记录(您分配的内容)。一旦内存使用结束,malloc()之后应该free(buff),否则就是内存泄漏。

答案 1 :(得分:8)

您可能会打印出整个字符串,但它不安全,您正在写入并读取未分配的内存。这会产生未定义的行为。

memcpy不进行任何内存分配。它只是读取和写入您提供的位置。它不会检查它是否正常,在这种情况下,如果您的程序没有崩溃,那么您很幸运。

答案 2 :(得分:1)

  

memcpy()如何运作?

因为您调用了未定义的行为。未定义的行为可能与您期望的完全一致,并且它可能会完全不同。它甚至可能在同一程序的不同运行之间有所不同。它也可以格式化你的硬盘并且仍然符合标准(当然这不太可能:P)

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

答案 3 :(得分:1)

memcpy不使用malloc。如您所料,您正在注销buff的结尾。在你的简单例子中,这没有明显的伤害,但它很糟糕。以下是“真实”程序中可能出现的一些问题:

  • 您可能会在buff之后的内存中分配内容中的内容,然后导致微妙(或不那么微妙)的错误。
  • 您可能会在mallocfree内部使用的标题上涂鸦,导致您在下次调用这些函数时出现崩溃或其他问题。
  • 您最终可能会写入尚未分配给您的进程的地址,在这种情况下,您的程序将立即崩溃。 (我怀疑这是你所期待的。)

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