gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:03:37 27 4
gpt4 key购买 nike

下面是一个非常简单的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com