我在 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
最初包含值 0
,即第一个内存位置的地址。在循环中,将位移添加到指针以访问后续整数。
我无法理解如何使用仅 0 到 9
的位移值访问直到 39
的内存地址。检查了一下发现指针是4的倍数递增,这是怎么回事?我猜这是因为整数类型指针,并且每个指针都应该按其数据类型的大小递增。这是真的吗?
但是如果我真的想使用整数指针指向内存位置 2 怎么办。所以,我这样做:p = 2
。那么,当我尝试取消引用该指针时,我是否应该期待出现段错误?
最佳答案
Now, from what I understand, the pointer p initially contains value 0
不,如果 malloc
成功返回,指针 p
将不会保存值 0
。
在声明它时,指针未初始化并且很可能持有垃圾值。一旦将其分配给 malloc
返回的指针,该指针就会指向分配器认为未占用的动态分配内存区域。
I cannot understand how the memory addresses uptil 39 are accessed with a displacement value of only 0 to 9
实际位移值是 0, 4, 8, 12 ... 36
。因为指针 p
有一个类型,在那种情况下是 int *
,这表明指针算法中应用的偏移量是 sizeof(int)
,在你的情况下 4
。换句话说,位移乘数始终基于指针指向的类型的大小。
But what if I actually want to point to memory location 2 using an integer pointer. So, I do this: p = 2. Then, when I try to de-reference this pointer, should I expect a segmentation fault?
2
的确切位置很可能在您的进程的地址空间中不可用,因为该部分将被操作系统保留,或者将以另一种形式受到保护。所以从这个意义上说,是的,您会遇到段错误。
然而,在不能被其大小整除的位置访问数据类型的一般问题是违反了对齐要求。许多架构会坚持在 4 字节边界上访问 int,在这种情况下,您的代码将触发未对齐的内存访问,这在技术上是未定义的行为。
关于c - 递增指向数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15090461/