Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指针操作期间的Seg故障_C_Pointers_Struct_Segmentation Fault_Malloc - Fatal编程技术网

C 指针操作期间的Seg故障

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 =

我在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 = 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));