gpt4 book ai didi

C 数组索引和访问越界

转载 作者:行者123 更新时间:2023-11-30 20:09:54 27 4
gpt4 key购买 nike

所以我有一个程序

#include "main.h"
#import <limits.h>
#import <stdint.h>

int foo(const void *src, void *dst, uint16_t len)
{
uint16_t index;
const uint8_t *srcRef = src;
uint8_t *dstRef = dst;

for(index = 0; index <= len; index++)
{
dstRef[index] = srcRef[index];
printf("-> %d - %d\n", index, srcRef[index]);
}
printf("%d\n", index);
return 0;
}

int main()
{
printf("max length of UInt16 is : %d\n", UINT16_MAX);
uint8_t arrOr[55];
uint8_t arr[55];
arrOr[54] = 7;
uint16_t len = 119;
foo(arrOr, arr, len);
return 0;
}

程序能够越界访问数组索引是否正常? (其实我本来以为它会崩溃)当数组长度为55时,最多可以访问119(120会崩溃)。

当它是56时,我仍然只能访问最多119,120会崩溃

当它是 57 时,我最多可以访问 135,而 136 会使它崩溃。

我猜它正在尝试访问分配给整个程序的内存地址,而不仅仅是数组索引。但是,当我将数组长度更改为 57 时,实际上发生了什么,这让我可以访问更多地址,而将其增加到 56 却无法访问这些地址?

最佳答案

看起来对齐很重要。

首先,这是undefined behavior所以不要依赖它。根据 ISO C 标准,访问越界是 UB。

再次警告:以下内容高度依赖于实现。请自行决定继续。

<小时/>

嗯,先回答吧。您的猜测是正确的:

I guess it's trying to access memory addresses given to the whole program and not just the array indexes.

有点有趣的是,您的数字 120136 相差 16,所以我猜这是由 8 对齐引起的(您有 2 个数组)。在现代计算机中,出于性能考虑,内存中的数据是对齐的。对于典型的 64 位系统,它与 8 对齐,因此数组 arrarrOr 都与 8 字节对齐。也就是说,当您声明大小为 57 时,它实际上占用了 64 字节内存(因此,如果您声明的大小在 57 到 64 之间,您不会观察到任何差异,但如果是 65,则会观察到任何差异)。

对于大于64的额外空间,可能是因为调用堆栈。这意味着您正在访问父函数中的变量,例如 mainWinMain 或上面的任何函数。当程序启动时,系统会定义一些变量(Windows 上的 hInstancecommandLinehPrevInstance 等)。当您访问甚至修改这些内存区域时,您就有破坏程序甚至整个系统的风险。这也是越界访问不好的原因之一。

最后一行(允许我重复注释,因为它很重要),这是依赖于实现的,并且当您在另一个平台甚至同一平台的不同版本上编译代码时可能会发生变化。

顺便说一句,#import 不是标准预处理器指示符。它(很可能)仅可用 in Visual Studio 2017 。以后不要这样做。我猜您正在基于该代码在 Windows 上使用 VS 2017。

关于C 数组索引和访问越界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48072219/

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