我刚开始学习结构,我正尝试用它们和指针一起来获得更好的C编程技能。现在,在这个过程中,我必须预加载程序中的4名员工中的2名(具体来说,是db1[4]的0和1槽)。现在,在预压时,程序可以加载第一个员工(姓名、性别和薪水),但是在尝试加载第二个员工时,我会得到一个分段错误(第27行)。
我的验证者告诉我,通过使用sizeof(db_mold)获取结构定义的大小,理论上,我可以逐槽跳槽,将n乘以sizeof(db_mold)的结果并将其添加到指针中。
sizeof(db_mold)似乎是28,但是在使用公式(sizeof(db_mold)*n)并将其添加到db1p之后,我得到了一个分段错误。
现在,正如我在另一个question中所读到的,结构可以有填充,但是我不知道这些填充放在哪里,它们有多大。另外,在这个问题中没有提到的是,如果我有一个AoSwAaNA (带有数组和非数组的结构数组),会发生什么。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char nombre[20];
char sexo;
unsigned int sueldo;
}db_mold;
void preload(db_mold *, int);
void user_load(db_mold *, int);
int main(){
db_mold db1[4] = {0};
preload(&db1[0], (sizeof(db_mold)));
user_load(&db1[0], (sizeof(db_mold)));
}
void preload(db_mold *db1p, int sizedb){
strcpy((db1p+(sizedb*0))->nombre, "Franco");
(db1p+(sizedb*0))->sexo = 'M';
(db1p+(sizedb*0))->sueldo = 20000;
strcpy((db1p+(sizedb*1))->nombre, "Romina");
(db1p+(sizedb*1))->sexo = 'F';
(db1p+(sizedb*1))->sueldo = 23000;
}
void user_load(db_mold *db1p, int sizedb){
for (int i = 2; i < 4; i++){
char tmp[20] = {0};
printf("Ingrese el nombre del empleado %d: ", i);
fgets(tmp, sizeof tmp, stdin);
strcpy(tmp, (db1p+(sizedb*i))->nombre);
//fgets((db1p+(sizedb*i))->nombre, sizeof *((db1p+(sizedb*i))->nombre), stdin);
printf("Ingrese el Sexo (M o F) del empleado %d: ", i);
(db1p+(sizedb*i))->sexo = getchar();
getchar();
printf("Ingrese el salaio del empleado %d: ", i);
scanf("%u", &(db1p+(sizedb*i))->sueldo);
printf("Empleado Cargado!\n");
}
}注意:它还没有完成
发布于 2022-06-06 21:31:32
要么你的教授弄错了要么你误解了。您不需要乘以结构的大小,因为指针算法会自动完成这一任务。如果您也这样做,那么所有的索引都会被乘以两次,从而访问数组之外的部分,从而导致未定义的行为。
只有在执行算术之前将指针转换为char*时,才需要这样做。
填充不是问题,因为sizeof包含填充。
https://stackoverflow.com/questions/72523613
复制相似问题