繁体   English   中英

我无法访问结构数组上的字段

[英]I can't access the fields on a struct array

我正在学习如何编程,但在我一直在做的事情上遇到了障碍。 一旦我使用该函数,我打印 disp 字段的值,但它显示“0”,然后它卡在输入部分。

typedef struct{
    char disp;
    int cod;
    float costH;
    float costS;
    char nom_emp[50];
    int cod_emp;
    float precio;
}REG;
int main(){
    int end=1;
    int cont, selector;
    REG *registro[28];
    for (int i = 0; i <= cont; i++){
         IngresoRep(&registro[i], i);
         }
}

void IngresoRep(REG * data, int i1){
    //Input and control of device
    scanf("%c", &data->disp); getchar();
    while (data->disp != 'E' && data->disp != 'N' && data->disp != 'T'){
        printf("\nTry again ");
        scanf("%c", &data->disp); getchar();
    }

我怀疑这可能与 -> 使用有关,但我对这些部门不太了解。 我也不想使用任何“更高级”的功能。

您有多个问题,都与registro数组以及如何使用它有关:

REG *registro[28];

在这里,您定义了一个包含28个指向REG结构的指针的数组。 但是您将所有指针都保留为未初始化(这意味着它们将具有不确定的(读取:垃圾)值并且对取消引用无效)。

幸运的是,您实际上并没有取消引用指针,而是使用指针上的指针运算符来获取指向它们的指针:

IngresoRep(&registro[i], i);

registro[i]的类型是REG * &registro[i]的类型是REG ** 这不是IngresoRep函数所期望的。 由于您传递了错误的指针,您将有未定义的行为

要解决这两个问题, registro定义为REG结构数组,而不是指针:

REG registro[28];  // 28 REG structure objects

现在在对IngresoRep的调用中使用&registro[i]将是正确的,并且符合函数的预期。


此外,您真的应该在main函数之前对IngresoRep函数进行前向声明:

// Forward declaration of the function
void IngresoRep(REG * data, int i1);

int main(){
    // ...
}

void IngresoRep(REG * data, int i1){
    // ...
}

通过这个前向声明,编译器将能够检测您是否将错误的参数传递给函数,并会警告您。

REG registro[28]; // I removed *

registro试图成为数据类型 struct REF 的数组,因此不需要*符号:

  • 没有*你拥有的是 28 个数据类型 struct REG 的元素
  • 使用*你拥有的是 28 个指向数据类型 struct REG 的指针

后来正确寻址registro元素的方法不包括&操作,名称registro是指向第一个元素的指针,所以registro + i是指向第i个元素的指针

IngresoRep(registro+i, i); // IngresoRep(&registro[i], i);

我不太热衷于 C。但是当您启动数组 (REG *registro[28]) 时,您的 REG 结构中没有任何数据,因此您的数据可能会被设置为 int 的默认值 0,和 null 的字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM