我在HSW上看到这个节目:
int *p;
int i;
p = (int *)malloc(sizeof(int[10]));
for (i=0; i<10; i++)
*(p+i) = 0;
free(p);
我不完全理解这个循环。
假设内存是字节可寻址的,每个整数占用4个字节的内存,假设我们将40个字节的内存分配给从地址
p
到0
的指针。现在,根据我的理解,指针最初包含值,即第一个内存位置的地址在循环中,将位移添加到指针以访问后续整数。
我无法理解如何仅使用
39
的位移值访问正常运行p
的内存地址我检查了一下,发现指针以4的倍数递增。这是怎么发生的我猜这是因为整型指针,每个指针都应该是按其数据类型的大小递增的。这是真的吗?但如果我真的想用一个整数指针指向内存位置2呢。所以,我这样做:
0
那么,当我试图去引用这个指针时,我是否应该期望出现分段错误? 最佳答案
现在,根据我的理解,指针p最初包含值0
不,如果p
成功返回,指针0
将不会保存值malloc
。
在声明它的时候,指针是未初始化的,很可能包含一个垃圾值。一旦将其分配给malloc
返回的指针,指针就会指向分配程序认为未占用的动态分配内存区域。
我无法理解如何访问正常运行39的内存地址
位移值只有0到9
实际位移值为0, 4, 8, 12 ... 36
因为指针p
有一个类型,在这种情况下是int *
,这表明指针算法中应用的偏移量是sizeof(int)
,在您的情况下是4
换句话说,位移乘数总是基于指针指向的类型的大小。
但是如果我真的想用一个
整数指针。所以,我这样做:p=2然后,当我试图
取消引用此指针,是否应该出现分段错误?
在进程的地址空间中,2
的确切位置很可能不可用,因为该部分将由操作系统保留,或者将以其他形式受到保护。所以从这个意义上说,是的,你会得到一个分割错误。
然而,在不能被数据类型的大小均匀分割的位置访问数据类型的一般问题是破坏对齐要求许多体系结构都会坚持在4字节的边界上访问int,在这种情况下,代码将触发未对齐的内存访问,这在技术上是未定义的行为。
关于c - 递增指向数组的指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15090461/