标题:[实践OK]数组的首地址是一个指针,和单个不一样,数组可以取越界。 出处:向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除 时间:Fri, 18 Oct 2019 14:53:30 +0000 作者:jackxiang 地址:http://jackxiang.com/post/10330/ 内容: 背景:好久没有摸C了,顺带学一下C语言数组下标的越界是否能访问到东西的问题,是能访问到的,但这些值没有任何意义,可能对于一些黑客有一定意义,但咱不细深入,简单了解一下即可。 cat test.c #include #include int main() { int *j; int i[3] = {99, 100, 101}; printf("i[0]===%d\n", i[0]); printf("i[1]===%d\n", i[1]); printf("i[2]===%d\n", i[2]); printf("i[3]===%d\n", i[3]); printf("i[4]===%d\n", i[4]); printf("i[5]===%d\n", i[5]); //i is a arr pointer printf("*i===%d\n", *i); printf("*(i+1)===%d\n", *(i+1)); printf("*(i+2)===%d\n", *(i+2)); printf("*(i+3)===%d\n", *(i+3)); printf("*(i+4)===%d\n", *(i+4)); printf("*(i+5)===%d\n", *(i+5)); j=i; printf("\n*j===%d\n", *j); printf("*(j+1)===%d\n", *(j+1)); printf("*(j+2)===%d\n", *(j+2)); printf("*(j+3)===%d\n", *(j+3)); printf("*(j+4)===%d\n", *(j+4)); printf("*(j+5)===%d\n", *(j+5)); exit(0); } #make test cc test.c -o test #./test i[0]===99 i[1]===100 i[2]===101 i[3]===0 i[4]===1559561856 i[5]===32764 *i===99 *(i+1)===100 *(i+2)===101 *(i+3)===0 *(i+4)===1559561856 *(i+5)===32764 *j===99 *(j+1)===100 *(j+2)===101 *(j+3)===0 *(j+4)===1559561856 *(j+5)===32764 === 如果不是整数数组,只是一个定义整数,j=i;是不行的,得: int a = 6; int *p = &a; 原因是:数组的首地址是指针,而单个整数变量不是指针,上面这个情况得用&取到其地址赋值给指针变量p,如下: int *p; p = &a; Generated by Jackxiang's Bo-blog 2.1.1 Release