Memcpy 将更多数据复制到更小的大小中

问题描述 投票:0回答:2

我声明了 2 个字符串,即 string1 和 string2。 string1 的大小为 8,string2 的大小为 200。现在,我尝试将 string2 复制到 string1。 string1 的大小小于 string2。我正在复制与 string2 大小相同的字节数。我的问题是为什么 memcpy 允许将更多字节数复制到分配较少字节数的位置?如果我现在打印 string1 的值,那么我将得到与 string2 相同的值。但是string1没有那么多内存来容纳string2。我想知道这种异常行为背后的原因。

// C program to demonstrate working of memcpy
#include <stdio.h>
#include <string.h>

int main()
{
    char str1[8] = "Hello\0";
    char str2[200] = "QuizLinkssjdjufuuejjhfgyyryryyryrynshshhsjakskkk\0";

    puts("str1 before memcpy ");
    puts(str1);

    // Copies contents of str2 to str1
    memcpy(str1, str2, sizeof(str2));

    puts("\nstr1 after memcpy ");
    puts(str1);

    return 0;
}

以下是输出。

str1 before memcpy 
Hello


str1 after memcpy 
QuizLinkssjdjufuuejjhfgyyryryyryrynshshhsjakskkk
c memory memory-management memory-leaks memcpy
2个回答
1
投票

为什么 memcpy 允许将更多字节数复制到分配较少字节数的位置

C 不对数组执行任何类型的边界检查。这就是它变得快速的部分原因。这也意味着程序员有责任不要写入超出数组的边界。如果这样做,则会在代码中触发“未定义行为”。您所看到的是未定义行为的表现方式之一。 解决方案:不要读取或写入超出数组末尾的内容。


0
投票
我的问题是为什么 memcpy 允许将更多字节数复制到分配较少字节数的位置?

内存的

分配

是进程中的记录保存。您的进程被允许使用的操作系统授予内存(并且它可以通过向操作系统发出各种请求来请求更多内存)。在现代系统中,这通常是大量内存,用于静态数据、硬件堆栈、动态分配的内存、程序指令等。有了该内存,您的程序就有责任控制它的使用方式。 操作系统和硬件控制尝试使用操作系统授予的内存之外的内存。在您被授予的内存中,由您的程序决定如何使用内存(有一些限制,例如某些内存可能被标记为只读或不可执行)。

C 标准不会强加超出此范围的要求:它不需要 C 实现来阻止程序尝试将超出已分配空间的数据复制到

str1

中。您必须知道限制是什么,并编写代码以尊重它们。

可以设计跟踪内存分配并防止程序写入超出为数组分配的空间的编程语言和环境,但这会给计算带来额外的成本。它需要额外的内存和处理器指令。 C 被设计为快速高效,但代价是增加了程序员仔细编写代码的负担。

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