指向结构数组中连续元素的指针不是均匀偏移?

时间:2017-07-22 10:33:02

标签: c pointers structure pointer-arithmetic

这是一个重复的问题,但无法在任何地方找到正确的解释。

我有以下代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct student_data_boys
{
    int roll_b;
    char name_b[4];
} student_data_boys;

int main()
{
    student_data_boys *ptr;
    int i;
    int num = 5;
    ptr = (student_data_boys *) malloc(num * sizeof(student_data_boys));
    if(ptr == NULL) 
        printf("Can't allocate memory.\n");
        exit(1);
    }
    printf("Allocated memory space size is : %ld bytes.\n",
         (num * sizeof(student_data_boys)));
    for(i=0;i<num;i++) {
        printf("Start address of data1[%d] is : %p.\n", i+1, ptr+i);
    }
    free(ptr);
}

当我递增结构指针时,预期的下一个地址是基地址加上结构块的大小(这里是8),但是当我看到输出时,下一个大小不是预期的。

输出如下:

Allocated memory space is : 40.
Start address of data1[1] is : 0x55f5097c1010.
Start address of data1[2] is : 0x55f5097c1018.
Start address of data1[3] is : 0x55f5097c1020.
Start address of data1[4] is : 0x55f5097c1028.
Start address of data1[5] is : 0x55f5097c1030.

有人可以解释这种行为吗?

1 个答案:

答案 0 :(得分:5)

您看到的地址符合您的期望,而且确实相差8个字节。只是printf格式字符串中的%p会产生十六进制表示法(正如您可以从0x前缀中看出来的那样)。因此,例如,0x55f5097c1020 - 0x55f5097c1018 == 8