正在读取一些文本并试图在C中写入超过数组的大小,即缓冲区溢出。文本表明,当数组的长度为5时,当你试图写array[5]
时,你会得到一个分段错误,但我似乎没有得到它,当使用下面的代码时。代码实际运行。
#include <stdio.h>
#include <string.h>
int main ()
{
int i;
int array[5] = {1, 2, 3, 4, 5};
for (i = 0; i <= 255; i++)
{
array[i] = 10;
}
int len = sizeof(array) / sizeof(int);
printf("%d\n", len);
printf("%d\n", array[254]);
}
执行最后一个语句时,会打印10
。我想知道这是一个漏洞还是我遗漏了什么。我在macbook pro上运行iterm2的代码。
答案 0 :(得分:4)
写完结束是未定义的行为 - 任何事情都可能发生。
答案 1 :(得分:1)
您正在将数据写入数组的末尾。这是未定义的行为。未定义的行为意味着它可能在星期五工作但在星期六崩溃。
这是C段,表示它是未定义的行为:
(C99,6.5.3.2p4)如果为指针指定了无效值,则unary *运算符的行为未定义。
答案 2 :(得分:0)
您将能够检查当前进程拥有的任何内存。当您点击该内存块的末尾时,您将收到EXC_BAD_ACCESS错误。尝试这个循环的代码的修改版本,直到操作系统杀死它:
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[])
{
int i = 0;
int array[5] = {1, 2, 3, 4, 5};
while (1)
{
printf("%llu - %d\n", i, array[i]);
// if (&i == &array[i]) printf("Overwriting i\n");
// array[i] = 2;
++i;
}
}
如果取消注释注释掉的行,你会发现你陷入了3和6之间的无限循环。你正在覆盖位于i
整数地址的内存。