#include <stdio.h>
#include <stdlib.h>
int main()
{
char *p = malloc(10);
int i;
for(i=0;i<15;i++)
{
p[i]='c';
printf("INDEX:%d %c\n",i,p[i]);
}
return 0;
}
我不确定为什么在上面的代码中,我只分配了10的内存,但我仍然可以访问指针的第15个索引。
我不确定为什么,但我认为这是因为这个指针指向一些随机的内存块而我只是覆盖了那部分内存,但我只是分配一个具体的记忆量,所以我不确定它为什么会起作用。
有人可以确认吗?
答案 0 :(得分:4)
在C中,当您访问带有越界索引的数组时,根据C语言,行为未定义,因为C / C ++实际上没有对数组进行任何boudary检查。它只取决于操作系统,以确保您访问有效的内存。
简而言之,您幸运。
通常,数组在相邻的内存地址中分配。添加指针时,编译器将只生成访问相邻内存的代码。由于它仍然在程序的内存空间中,因此操作系统不会触发错误。
有一些工具,如valgrind,还有一些有用的编译器标志可用于检测其中一些错误。
例如,如果您在valgrind
中运行生成的二进制文件,valgrind
会在写入p[10]
时生成以下消息
==14590== Invalid write of size 1
==14590== at 0x4005B2: main (in /home/lingkun/Develop/courage/cpp/src/a.out)
==14590== Address 0x520204a is 0 bytes after a block of size 10 alloc'd
==14590== at 0x4C2BBA0: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14590== by 0x400597: main (in /home/lingkun/Develop/courage/cpp/src/a.out)
==14590==
==14590== Invalid read of size 1
==14590== at 0x4005C2: main (in /home/lingkun/Develop/courage/cpp/src/a.out)
==14590== Address 0x520204a is 0 bytes after a block of size 10 alloc'd
==14590== at 0x4C2BBA0: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14590== by 0x400597: main (in /home/lingkun/Develop/courage/cpp/src/a.out)
==14590==
INDEX:10 c
INDEX:11 c
INDEX:12 c
INDEX:13 c
INDEX:14 c
答案 1 :(得分:4)
我不确定为什么在上面的代码中,我只分配了10的内存,但我仍然可以访问指针的第15个索引。
访问超出您请求的内存是导致未定义的行为。如果程序没有崩溃,你应该认为自己不幸。它会在最不合时宜的时刻表现得很奇怪。