c - 将数据(字符串)越界存储在动态分配的数组中

标签 c string

下面是一个非常简单的 C 程序:

char *p = (char*)calloc(5,sizeof(char));
strcpy(p,"Elephant");
printf("String = %s\n", p);
p[6] = 'D';
printf("String = %s\n", p);

使用 calloc() 分配一个包含 5 个元素的 char 数组,并使用 strcpy() 将字符串复制到数组中。以下是输出:

String = Elephant
String = ElephaDt

显然,我只请求了 5 个 char 元素,因此很想知道为什么操作系统内存管理允许我在 p 的动态分配空间范围之外存储更多元素。如果我只分配了 5 个字符的空间,strcpy() 是如何存储一个更大的字符串“Elephant”,其长度大于 5 个字符?

最佳答案

分配内存时,通常由内存管理器完成。它们通常从操作系统分配更大的内存块,然后将其交给 malloc() 和更小部分的 friend 。

因此,您分配的 5 个字节很可能是更大内存块的一部分。由于您违反了分配的边界,但没有违反更大块的边界,因此操作系统不会干扰。但是,这可能意味着您通过覆盖附近的分配破坏了您自己程序的其他内存。它甚至可能意味着您损坏了内存管理器用来跟踪已分配和可用内存的数据。但这不是给定的。这只是未定义的行为。

未定义的行为 并不意味着您一定会遇到运行时错误。它也可以意味着什么都没有发生,或者你开始了 WW3,或者其他什么。它是未定义的,但并不一定意味着崩溃。

关于c - 将数据(字符串)越界存储在动态分配的数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38300576/

相关文章:

c - 二进制文件和文本文件在存储方面的区别?

c - 使用 gcc 和 glib 的奇怪行为?

c - 格式化输出 - 相同数据到 C 中的多个文本文件

objective-c - 一个奇怪的 C 字符串和 NSString 比较问题

Python3 将 Unicode String 转换为 int 表示

c++ - 如何使用 C++ 在 Windows 中添加虚拟文件夹

c - 为什么我的 IOCTL 调用适用于 copy_from_user 但不适用于 get_user?

java - 字符串数组中的 indexOf

sql - oracle DB 为什么具有空格比较的字符串总是给出 false?

c - 有多少空字节,在 C 中连接字符串