首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在内存中组织具有数组和非数组的结构数组?

如何在内存中组织具有数组和非数组的结构数组?
EN

Stack Overflow用户
提问于 2022-06-06 21:24:14
回答 1查看 33关注 0票数 0

我刚开始学习结构,我正尝试用它们和指针一起来获得更好的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 (带有数组和非数组的结构数组),会发生什么。

这是我的代码:

代码语言:javascript
复制
#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");
    }
}

注意:它还没有完成

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-06 21:31:32

要么你的教授弄错了要么你误解了。您不需要乘以结构的大小,因为指针算法会自动完成这一任务。如果您也这样做,那么所有的索引都会被乘以两次,从而访问数组之外的部分,从而导致未定义的行为。

只有在执行算术之前将指针转换为char*时,才需要这样做。

填充不是问题,因为sizeof包含填充。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72523613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档