申请 1024个整数大小的内存,用循环去给该内存赋值的时候发现居然执行了 1028次。。有点不解,求大神解答
#include
#include
#include
int main(){
int * p = (int *)malloc(sizeof(int)*1024);//申请空间
sizeof(*p);
printf("%x", p);
srand((unsigned)time(NULL));
int i=0;
while (p){
if (*p == NULL)
break;
*p = rand()%100;
printf("%d\n", *p);
p++;
i++;
}
printf("%d", i);//打印循环的次数
system("pause");
}
因为你用p是否为NULL来判断,内存可能刚好在你分配的1024空间后也是符合条件的值,这样你就会多执行
但是那样的话,不就访问到了并非该进程的内存空间了吗,应该会报错吧?每次运行都运行出一个 1028。。
C语言不会进行下标越界检查,
int * p = (int *)malloc(sizeof(int)*1024);
int x = p[1028];
也不会报错。
为什么是1028,因为正好堆上相邻的位置有一个四个字节为0的区域。但是换一个编译器/环境,可能结果不同,你要有兴趣,可以试试看