【发布时间】:2018-01-03 06:24:25
【问题描述】:
所以我有一个程序
#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 则无法访问?
【问题讨论】:
-
请调整您的代码,使其不会包含不适合专业话语的词语。
-
#import <stdint.h>? -
您确定这是您编译的确切代码吗?我认为这不会在没有错误的情况下编译。
-
等等...
#import是什么黑客? Visual Studio 2017 风格? -
在你问这个问题之前,问问自己这在哪里有用?为什么你会访问超出你的数组边界?