我正在尝试通过将占位符数组的大小添加到第一个元素来访问动态分配的下一个元素。占位符数组的大小是4个字节,所以如果我向地址为2147549788的第一个元素添加4个字节,我应该查看下一个内存位置2147549792.但是,我正在查看一个16字节的地址2147549804.如果我读了数组元素的地址直接我得到正确的地址。想知道为什么添加占位符的大小会产生不同的结果? 此外,如果我访问for循环外的第二个元素的位置,该位置将被另外16个字节关闭,即2147549820
#include "stdio.h"
#include "time.h"
#include <stdlib.h>
#include <string.h>
typedef struct Section {
int numOfStudents;
} Section;
typedef struct School {
int schoolId;
Section sections[1]; //placeholder
} School;
int main(void)
{
School *schoolA_p;
Section section1;
int sizeOffset = 0;
int i,sectionSize;
int sizeOfSchool = sizeof(School) - sizeof(Section) + (sizeof(Section)*2);
schoolA_p = (struct School *) malloc(sizeOfSchool);
for(i=0;i<2;i++)
{
sectionSize = sizeof(Section);
printf("\nsize of section = %d\n", sizeof(Section));
printf("Number of bytes to add to first element to access the next element = %d\n", sizeOffset);
printf("In Loop Location of schoolA_p->sections[%d]= 0x%lx\n",i, &(schoolA_p->sections[0]) + sizeOffset);
sizeOffset += sectionSize;
}
printf("\n Location of schoolA_p->sections[0]= 0x%lx\n",&(schoolA_p->sections[0]));
printf("\n Location of schoolA_p->sections[1]= 0x%lx\n",&(schoolA_p->sections[1]));
printf("\n Outside of lopop Location of schoolA_p->sections[0]= 0x%lx\n", &(schoolA_p->sections[0])+ sizeOffset);
free(schoolA_p);
return 0;
}
答案 0 :(得分:2)
指针算法的工作方式如下:如果p
是指向数组元素a[n]
的指针,则p + i
是指向a[n + i]
的指针。换句话说,指针算术以指针被声明为的任何基类型为单位移动,而不是字节。
答案 1 :(得分:1)
C指针算法会考虑递增指针时指向的数据大小。
因此,如果p
是指向4字节数据的指针,p + 1
将计算p
之后的4个字节的地址。
换句话说,你做了太多的工作。 C为你做了这个簿记,这就是你得到错误结果的原因。
作为旁注,这就是为什么你不能在void*
指针上使用指针算法的原因。未指定指向的数据大小。