这个要看编译器的,老师讲的内容,其实数组已经越界,在实际使用中不会出现的,如果实际应用中出现说明程序有问题。
因为老师的代码中写的时array[2]进行测试的,所以结果不一样,而且第四个和第五个输出的值是随机生成的,不同的电脑有差别,第六个才是array[0]
解决了吗
你看一下是从哪里开始的偏移了几格?如果移到你程序里面没有初始化的值就会出现这种情况
我用vs2017调试的,老师讲的各个int变量的排列是跟编译器有关的。
只要知道,指针是地址就行了。想要能完全弄懂,可以看看汇编相关知识,会讲到小端,大端,原码补码等相关知识。
输出和指向的语句是不一样的啊
感觉是编译器和系统的原因,我打印出来也不是视频里面的那个样子,我估计是系统或者GCC对内存的管理有点不一样导致的,以为每个版本的系统内存优化会有点差别,gcc也是,从而导致了这样。我猜是这样的。。。。。。
函数每次调用都会有他独立的栈帧,是从是从高地址向低地址延伸的,栈帧底部为高地址,栈顶为低地址。相当于分配了一段固定的内存空间。而定义的变量在这段空间内部,地址是由低到高的。
自己用gdb打印指向地址看看就好了。
那个乱码应该不是数组的内容而是没有分配的地址打印出来了。
内存分配是连续的
同求这个问题
答:int 定义一个整型数,默认值不是0,定义的这个整型变量相当于只是开辟了一块内存空间,其里的值是操作系统自己分配的,我们不知道,相当于乱码,所以输出的值才是65280,它是个不确定的数
指针偏移3次,第一次从a移动到i,第二次从i移动到b,第三次从b移动到array[0]
老师是在声明语句里直接定义了p指针的值是a的地址,如果分开写,那么就是int *p; p = &a;如果一起写,那就是int *p = &a;
因为你的程序里没有定义数组里第四第五个的变量的值。那么当程序运行到第四第五个的时候 ,程序要读取数组中第四第五个数所在的内存位置,然而你的代码中没有给他们赋值,那么那两个内存位置储存的数是别的程序运行后残留的数据,是程序员不可控的。
我也觉得很奇怪,难道是linux下面不会内存溢出吗
a i b这是编译器优化的吧,人为不能控制
提问: *p=i+1; 我理解是把i+1赋值给数组a,但不能理解作用是什么。想问这一语句大家怎么理解?作用和含义是什么?
回答:
首先理解符号的意思,*p有一层隐喻含义,暗示p的类型并不是普通变量,而是“内存地址”类型(内存地址类型的存储在32位机器中占4个字节,64位机器占8个字节),所以p是地址(比如0x7fffffffdde0),而*p代表到0x7fffffffdde0这个内存地址去取这个地址上存的值。
现在把i+1(假设i=4,那么i+1=5)的值5,保存到地址p(0x7fffffffdde0)上,也就意味着以后去p这个地址读取变量值得话,就会读到5。
因为你先定义的arry啊,所以array的地址在前面
你想表达什么?我不是很明白,但是我估计你可能是下面的问题,所以只以为是的解释一番,请斧正。
(gdb) p p
$6 = (int *) 0x7fffffffde6c
这个时候的输出的p的值表示p这个变量存入的地址,指的是p所代表的地址
(gdb) p &p
$4 = (int **) 0x7fffffffde78
这个时候的输出的值是表示p这个变量在内存中的地址,指的是p本身的地址
C编译器对于输出下标超出长度不会报错,但是运行时会发生不可预料的问题
你的输出是对的,我的和你的一样,可能是你的代码和视频的代码不同
我突然明白了,好傻啊,P运行了一次后,i就为1了呀
贴代码
C语言这种指针超出范围不会报错的,所以这需要你自己在写代码的时候谨慎。