C 指针操作期间的Seg故障
我在C中有以下结构C 指针操作期间的Seg故障,c,pointers,struct,segmentation-fault,malloc,C,Pointers,Struct,Segmentation Fault,Malloc,我在C中有以下结构 struct a { long state; long uid; long w, x, y, z, xx, yy, zz, xxx, yyy, zzz; char comm[64]; }; 然后我做一个malloc,如下所示 buf = malloc (100 * sizeof(struct a)); 但是当我试图访问如下的单个结构时,我得到了一个seg错误 for (i = 0; i < 100; ++i) { tmp =
struct a {
long state;
long uid;
long w, x, y, z, xx, yy, zz, xxx, yyy, zzz;
char comm[64];
};
然后我做一个malloc,如下所示
buf = malloc (100 * sizeof(struct a));
但是当我试图访问如下的单个结构时,我得到了一个seg错误
for (i = 0; i < 100; ++i) {
tmp = buf + (i * sizeof(struct a));
printf ("\t>%d>%ld,%ld\n", i, tmp->state, tmp->uid);
}
在前10个条目之后,我遇到seg故障。我不知道为什么会这样。请提供帮助。如果buf是指向结构a的指针,则指针数学应为:
tmp = buf + i;
这一行是错误的:
tmp = buf + (i * sizeof(struct a));
您不需要将i乘以数组中每个元素的大小,这是根据buf的类型隐式地为您完成的
你实际上在做的是
tmp = &buf[i * sizeof(struct a)];
当你真正想做的是
tmp = &buf[i];
编译器已经在指针运算期间处理sizeof advancement。因此,
ptr + i;
与
&ptr[i];
使用是错误的
但是我不明白这是怎么回事,我们不需要增加点的大小。Lets buf位于位置100,sizeofstruct a为50,因此下一个结构将位于右侧150。但是如果我们做buf+i,它不会只增加“i”个位置,例如,如果i=1,buf=100,那么buf+1将给出101个正确答案。请看AusCBloke的详细答案。另外,在32位或64位机器上,可能不会增加到150,因为默认情况下结构地址将是字对齐的。再一次,看看AusCBloke的答案,并相信您的编译器能够根据结构大小、单词对齐、填充、yada-yada-yada-yadapossible-replication正确地计算指针
ptr + (i * sizeof(some_type));